/ Hex Artifact Content
Login

Artifact 37d1493549a238bba56cc8a6e614191f43eac573:


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 2d  p->mxLookahead -
4700: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
4710: 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41  + 1;.  if( p->nA
4720: 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e  ction + n >= p->
4730: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a  nActionAlloc ){.
4740: 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c      p->nActionAl
4750: 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e  loc = p->nAction
4760: 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74 69 6f   + n + p->nActio
4770: 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20 20 20  nAlloc + 20;.   
4780: 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20 72 65   p->aAction = re
4790: 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f  alloc( p->aActio
47a0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
47c0: 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30  eof(p->aAction[0
47d0: 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c  ])*p->nActionAll
47e0: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  oc);.    if( p->
47f0: 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  aAction==0 ){.  
4800: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
4810: 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  rr,"malloc faile
4820: 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69  d\n");.      exi
4830: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(1);.    }.    
4840: 66 6f 72 28 69 3d 70 2d 3e 6e 41 63 74 69 6f 6e  for(i=p->nAction
4850: 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  ; i<p->nActionAl
4860: 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  loc; i++){.     
4870: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
4880: 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20  ookahead = -1;. 
4890: 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b       p->aAction[
48a0: 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a  i].action = -1;.
48b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
48c0: 53 63 61 6e 20 74 68 65 20 65 78 69 73 74 69 6e  Scan the existin
48d0: 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c  g action table l
48e0: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66  ooking for an of
48f0: 66 73 65 74 20 77 68 65 72 65 20 77 65 20 63 61  fset where we ca
4900: 6e 0a 20 20 2a 2a 20 69 6e 73 65 72 74 20 74 68  n.  ** insert th
4910: 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
4920: 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c  ction set.  Fall
4930: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
4940: 20 77 68 65 6e 20 74 68 61 74 0a 20 20 2a 2a 20   when that.  ** 
4950: 6f 66 66 73 65 74 20 69 73 20 66 6f 75 6e 64 2e  offset is found.
4960: 20 20 49 6e 20 74 68 65 20 77 6f 72 73 74 20 63    In the worst c
4970: 61 73 65 2c 20 77 65 20 66 61 6c 6c 20 6f 75 74  ase, we fall out
4980: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68 65   of the loop whe
4990: 6e 0a 20 20 2a 2a 20 69 20 72 65 61 63 68 65 73  n.  ** i reaches
49a0: 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69   p->nAction, whi
49b0: 63 68 20 6d 65 61 6e 73 20 77 65 20 61 70 70 65  ch means we appe
49c0: 6e 64 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73  nd the new trans
49d0: 61 63 74 69 6f 6e 20 73 65 74 2e 0a 20 20 2a 2a  action set..  **
49e0: 0a 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20 69  .  ** i is the i
49f0: 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41 63 74 69  ndex in p->aActi
4a00: 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e  on[] where p->mn
4a10: 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20 69 6e 73  Lookahead is ins
4a20: 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f  erted..  */.  fo
4a30: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63 74  r(i=0; i<p->nAct
4a40: 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ion; i++){.    i
4a50: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d  f( p->aAction[i]
4a60: 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a  .lookahead<0 ){.
4a70: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4a80: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
4a90: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
4aa0: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
4ab0: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
4ac0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
4ad0: 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  i;.        if( k
4ae0: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
4af0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
4b00: 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e  on[k].lookahead>
4b10: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
4b20: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d    }.      if( j=
4b30: 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  =p->nLookahead )
4b40: 20 62 72 65 61 6b 3b 20 20 2f 2a 20 46 69 74 73   break;  /* Fits
4b50: 20 69 6e 20 65 6d 70 74 79 20 73 6c 6f 74 73 20   in empty slots 
4b60: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
4b70: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
4b80: 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c  ookahead==p->mnL
4b90: 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20  ookahead ){.    
4ba0: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
4bb0: 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d  [i].action!=p->m
4bc0: 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e 74 69 6e  nAction ) contin
4bd0: 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ue;.      for(j=
4be0: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
4bf0: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ad; j++){.      
4c00: 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68    k = p->aLookah
4c10: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
4c20: 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61   - p->mnLookahea
4c30: 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69  d + i;.        i
4c40: 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e  f( k<0 || k>=p->
4c50: 6e 41 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b  nAction ) break;
4c60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
4c70: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f  aLookahead[j].lo
4c80: 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61 41 63 74  okahead!=p->aAct
4c90: 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[k].lookahead
4ca0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4cb0: 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68    if( p->aLookah
4cc0: 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70  ead[j].action!=p
4cd0: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74  ->aAction[k].act
4ce0: 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ion ) break;.   
4cf0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
4d00: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
4d10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
4d20: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f   n = 0;.      fo
4d30: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74  r(j=0; j<p->nAct
4d40: 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ion; j++){.     
4d50: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
4d60: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d  n[j].lookahead==
4d70: 6a 2b 69 2d 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  j+i-p->mnLookahe
4d80: 61 64 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  ad ) n++;.      
4d90: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 70  }.      if( n==p
4da0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 62  ->nLookahead ) b
4db0: 72 65 61 6b 3b 20 20 2f 2a 20 53 61 6d 65 20 61  reak;  /* Same a
4dc0: 73 20 61 20 70 72 69 6f 72 20 74 72 61 6e 73 61  s a prior transa
4dd0: 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20 20  ction set */.   
4de0: 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65   }.  }.  /* Inse
4df0: 72 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  rt transaction s
4e00: 65 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20 2a  et at index i. *
4e10: 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70  /.  for(j=0; j<p
4e20: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b  ->nLookahead; j+
4e30: 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61  +){.    k = p->a
4e40: 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f  Lookahead[j].loo
4e50: 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f  kahead - p->mnLo
4e60: 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20  okahead + i;.   
4e70: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d   p->aAction[k] =
4e80: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
4e90: 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d  ];.    if( k>=p-
4ea0: 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41  >nAction ) p->nA
4eb0: 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d  ction = k+1;.  }
4ec0: 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  .  p->nLookahead
4ed0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75   = 0;..  /* Retu
4ee0: 72 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74 68  rn the offset th
4ef0: 61 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  at is added to t
4f00: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20  he lookahead in 
4f10: 6f 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65  order to get the
4f20: 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f  .  ** index into
4f30: 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68   yy_action of th
4f40: 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65  e action */.  re
4f50: 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f  turn i - p->mnLo
4f60: 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a  okahead;.}../***
4f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4f80: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
4f90: 65 20 22 61 73 73 65 72 74 2e 63 22 20 2a 2a 2a  e "assert.c" ***
4fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
4fc0: 20 41 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e   A more efficien
4fd0: 74 20 77 61 79 20 6f 66 20 68 61 6e 64 6c 69 6e  t way of handlin
4fe0: 67 20 61 73 73 65 72 74 69 6f 6e 73 2e 0a 2a 2f  g assertions..*/
4ff0: 0a 76 6f 69 64 20 6d 79 61 73 73 65 72 74 28 66  .void myassert(f
5000: 69 6c 65 2c 6c 69 6e 65 29 0a 63 68 61 72 20 2a  ile,line).char *
5010: 66 69 6c 65 3b 0a 69 6e 74 20 6c 69 6e 65 3b 0a  file;.int line;.
5020: 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  {.  fprintf(stde
5030: 72 72 2c 22 41 73 73 65 72 74 69 6f 6e 20 66 61  rr,"Assertion fa
5040: 69 6c 65 64 20 6f 6e 20 6c 69 6e 65 20 25 64 20  iled on line %d 
5050: 6f 66 20 66 69 6c 65 20 5c 22 25 73 5c 22 5c 6e  of file \"%s\"\n
5060: 22 2c 6c 69 6e 65 2c 66 69 6c 65 29 3b 0a 20 20  ",line,file);.  
5070: 65 78 69 74 28 31 29 3b 0a 7d 0a 2f 2a 2a 2a 2a  exit(1);.}./****
5080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5090: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
50a0: 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a   "build.c" *****
50b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50c0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
50d0: 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e 73  Routines to cons
50e0: 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69 6e  truction the fin
50f0: 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e  ite state machin
5100: 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 0a  e for the LEMON.
5110: 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ** parser genera
5120: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64  tor..*/../* Find
5130: 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73 79   a precedence sy
5140: 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72 75  mbol of every ru
5150: 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  le in the gramma
5160: 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65 20  r..** .** Those 
5170: 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76 65  rules which have
5180: 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73 79   a precedence sy
5190: 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74 68  mbol coded in th
51a0: 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d 6d  e input.** gramm
51b0: 61 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b 73  ar using the "[s
51c0: 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75 63  ymbol]" construc
51d0: 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20 68  t will already h
51e0: 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e 70  ave the.** rp->p
51f0: 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69 6c  recsym field fil
5200: 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c 65  led.  Other rule
5210: 73 20 74 61 6b 65 20 61 73 20 74 68 65 69 72 20  s take as their 
5220: 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79  precedence.** sy
5230: 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20 52  mbol the first R
5240: 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20 61  HS symbol with a
5250: 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64 65   defined precede
5260: 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  nce.  If there.*
5270: 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73 79  * are not RHS sy
5280: 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65 66  mbols with a def
5290: 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65 2c  ined precedence,
52a0: 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 0a   the precedence.
52b0: 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64 20  ** symbol field 
52c0: 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a 2a  is left blank..*
52d0: 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65 50  /.void FindRuleP
52e0: 72 65 63 65 64 65 6e 63 65 73 28 78 70 29 0a 73  recedences(xp).s
52f0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 3b  truct lemon *xp;
5300: 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
5310: 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78   *rp;.  for(rp=x
5320: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
5330: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  rp->next){.    i
5340: 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d  f( rp->precsym==
5350: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
5360: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5370: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
5380: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
5390: 70 2d 3e 72 68 73 5b 69 5d 2d 3e 70 72 65 63 3e  p->rhs[i]->prec>
53a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
53b0: 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72 70  rp->precsym = rp
53c0: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
53d0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20      break;..}.  
53e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
53f0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
5400: 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d  Find all nonterm
5410: 69 6e 61 6c 73 20 77 68 69 63 68 20 77 69 6c 6c  inals which will
5420: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 65 6d   generate the em
5430: 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54  pty string..** T
5440: 68 65 6e 20 67 6f 20 62 61 63 6b 20 61 6e 64 20  hen go back and 
5450: 63 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72 73  compute the firs
5460: 74 20 73 65 74 73 20 6f 66 20 65 76 65 72 79 20  t sets of every 
5470: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20  nonterminal..** 
5480: 54 68 65 20 66 69 72 73 74 20 73 65 74 20 69 73  The first set is
5490: 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20   the set of all 
54a0: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
54b0: 20 77 68 69 63 68 20 63 61 6e 20 62 65 67 69 6e   which can begin
54c0: 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20 67 65 6e  .** a string gen
54d0: 65 72 61 74 65 64 20 62 79 20 74 68 61 74 20 6e  erated by that n
54e0: 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76  onterminal..*/.v
54f0: 6f 69 64 20 46 69 6e 64 46 69 72 73 74 53 65 74  oid FindFirstSet
5500: 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
5510: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
5520: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
5530: 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20  rule *rp;.  int 
5540: 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f 72  progress;..  for
5550: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
5560: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
5570: 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
5580: 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 42 5f 46 41  ]->lambda = B_FA
5590: 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  LSE;.  }.  for(i
55a0: 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  =lemp->nterminal
55b0: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
55c0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d  l; i++){.    lem
55d0: 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66  p->symbols[i]->f
55e0: 69 72 73 74 73 65 74 20 3d 20 53 65 74 4e 65 77  irstset = SetNew
55f0: 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ();.  }..  /* Fi
5600: 72 73 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20  rst compute all 
5610: 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f 7b  lambdas */.  do{
5620: 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20  .    progress = 
5630: 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65  0;.    for(rp=le
5640: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
5650: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
5660: 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c    if( rp->lhs->l
5670: 61 6d 62 64 61 20 29 20 63 6f 6e 74 69 6e 75 65  ambda ) continue
5680: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
5690: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
56a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 69 66 28 20  ){.         if( 
56b0: 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6c 61 6d 62  rp->rhs[i]->lamb
56c0: 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29 20 62 72  da==B_FALSE ) br
56d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
56e0: 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
56f0: 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70  hs ){.        rp
5700: 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20  ->lhs->lambda = 
5710: 42 5f 54 52 55 45 3b 0a 20 20 20 20 20 20 20 20  B_TRUE;.        
5720: 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20  progress = 1;.  
5730: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
5740: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
5750: 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d 70  ;..  /* Now comp
5760: 75 74 65 20 61 6c 6c 20 66 69 72 73 74 20 73 65  ute all first se
5770: 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20  ts */.  do{.    
5780: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
5790: 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70 72 6f 67  1, *s2;.    prog
57a0: 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f  ress = 0;.    fo
57b0: 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
57c0: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
57d0: 29 7b 0a 20 20 20 20 20 20 73 31 20 3d 20 72 70  ){.      s1 = rp
57e0: 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 66 6f 72  ->lhs;.      for
57f0: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
5800: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5810: 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  s2 = rp->rhs[i];
5820: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 32 2d  .        if( s2-
5830: 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
5840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f  ){.          pro
5850: 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64 28  gress += SetAdd(
5860: 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32 2d  s1->firstset,s2-
5870: 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  >index);.       
5880: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65     break;..}else
5890: 20 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20   if( s1==s2 ){. 
58a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 31 2d           if( s1-
58b0: 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45  >lambda==B_FALSE
58c0: 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65   ) break;..}else
58d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 6f 67  {.          prog
58e0: 72 65 73 73 20 2b 3d 20 53 65 74 55 6e 69 6f 6e  ress += SetUnion
58f0: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
5900: 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20  ->firstset);.   
5910: 20 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 6c         if( s2->l
5920: 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29  ambda==B_FALSE )
5930: 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 20   break;..}.     
5940: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
5950: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 20  e( progress );. 
5960: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43   return;.}../* C
5970: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
5980: 20 73 74 61 74 65 73 20 66 6f 72 20 74 68 65 20   states for the 
5990: 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a  grammar.  Links.
59a0: 2a 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ** are added to 
59b0: 62 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74 61  between some sta
59c0: 74 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  tes so that the 
59d0: 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74  LR(1) follow set
59e0: 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70  s.** can be comp
59f0: 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50  uted later..*/.P
5a00: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74  RIVATE struct st
5a10: 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 2f 2a  ate *getstate(/*
5a20: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20   struct lemon * 
5a30: 2a 2f 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64  */);  /* forward
5a40: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f   reference */.vo
5a50: 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 6c 65  id FindStates(le
5a60: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
5a70: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
5a80: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
5a90: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
5aa0: 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  ;..  Configlist_
5ab0: 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69  init();..  /* Fi
5ac0: 6e 64 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  nd the start sym
5ad0: 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  bol */.  if( lem
5ae0: 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20  p->start ){.    
5af0: 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
5b00: 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20  (lemp->start);. 
5b10: 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a     if( sp==0 ){.
5b20: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
5b30: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c  emp->filename,0,
5b40: 0a 22 54 68 65 20 73 70 65 63 69 66 69 65 64 20  ."The specified 
5b50: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25  start symbol \"%
5b60: 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20  s\" is not \.in 
5b70: 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66  a nonterminal of
5b80: 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c   the grammar.  \
5b90: 22 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73  "%s\" will be us
5ba0: 65 64 20 61 73 20 74 68 65 20 73 74 61 72 74 20  ed as the start 
5bb0: 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64  \.symbol instead
5bc0: 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c  .",lemp->start,l
5bd0: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d 3e  emp->rule->lhs->
5be0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d  name);.      lem
5bf0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
5c00: 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e       sp = lemp->
5c10: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d  rule->lhs;.    }
5c20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70  .  }else{.    sp
5c30: 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c   = lemp->rule->l
5c40: 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  hs;.  }..  /* Ma
5c50: 6b 65 20 73 75 72 65 20 74 68 65 20 73 74 61 72  ke sure the star
5c60: 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74  t symbol doesn't
5c70: 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69   occur on the ri
5c80: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
5c90: 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20  .  ** any rule. 
5ca0: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
5cb0: 20 69 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59   if it does.  (Y
5cc0: 41 43 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61  ACC would genera
5cd0: 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74  te a new.  ** st
5ce0: 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68  art symbol in th
5cf0: 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66  is case.) */.  f
5d00: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
5d10: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
5d20: 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  t){.    int i;. 
5d30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
5d40: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
5d50: 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b      if( rp->rhs[
5d60: 69 5d 3d 3d 73 70 20 29 7b 0a 20 20 20 20 20 20  i]==sp ){.      
5d70: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
5d80: 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68  >filename,0,."Th
5d90: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c  e start symbol \
5da0: 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e 20  "%s\" occurs on 
5db0: 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e 64  the \.right-hand
5dc0: 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65 2e   side of a rule.
5dd0: 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75 6c   This will resul
5de0: 74 20 69 6e 20 61 20 70 61 72 73 65 72 20 77 68  t in a parser wh
5df0: 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20 77  ich \.does not w
5e00: 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c 73  ork properly.",s
5e10: 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
5e20: 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
5e30: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
5e40: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
5e50: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
5e60: 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65 20  ion set for the 
5e70: 66 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a 2a  first state.  **
5e80: 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77 68   is all rules wh
5e90: 69 63 68 20 68 61 76 65 20 74 68 65 20 73 74 61  ich have the sta
5ea0: 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68 65  rt symbol as the
5eb0: 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e  ir.  ** left-han
5ec0: 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72 28  d side */.  for(
5ed0: 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  rp=sp->rule; rp;
5ee0: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73 29   rp=rp->nextlhs)
5ef0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e  {.    struct con
5f00: 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20 20  fig *newcfp;.   
5f10: 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67   newcfp = Config
5f20: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72 70  list_addbasis(rp
5f30: 2c 30 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28  ,0);.    SetAdd(
5f40: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a  newcfp->fws,0);.
5f50: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
5f60: 65 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  e the first stat
5f70: 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74  e.  All other st
5f80: 61 74 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a  ates will be.  *
5f90: 2a 20 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d  * computed autom
5fa0: 61 74 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20  atically during 
5fb0: 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
5fc0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  of the first one
5fd0: 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72  ..  ** The retur
5fe0: 6e 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ned pointer to t
5ff0: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20 69  he first state i
6000: 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20  s not used. */. 
6010: 20 28 76 6f 69 64 29 67 65 74 73 74 61 74 65 28   (void)getstate(
6020: 6c 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b  lemp);.  return;
6030: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
6040: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
6050: 74 65 20 77 68 69 63 68 20 69 73 20 64 65 73 63  te which is desc
6060: 72 69 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ribed by the con
6070: 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69  figuration.** li
6080: 73 74 20 77 68 69 63 68 20 68 61 73 20 62 65 65  st which has bee
6090: 6e 20 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c  n built from cal
60a0: 6c 73 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74  ls to Configlist
60b0: 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  _add..*/.PRIVATE
60c0: 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74   void buildshift
60d0: 73 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  s(/* struct lemo
60e0: 6e 20 2a 2c 20 73 74 72 75 63 74 20 73 74 61 74  n *, struct stat
60f0: 65 20 2a 20 2a 2f 29 3b 20 2f 2a 20 46 6f 72 77  e * */); /* Forw
6100: 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45  d ref */.PRIVATE
6110: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67   struct state *g
6120: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 0a 73 74  etstate(lemp).st
6130: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
6140: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ;.{.  struct con
6150: 66 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20  fig *cfp, *bp;. 
6160: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
6170: 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  tp;..  /* Extrac
6180: 74 20 74 68 65 20 73 6f 72 74 65 64 20 62 61 73  t the sorted bas
6190: 69 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74  is of the new st
61a0: 61 74 65 2e 20 20 54 68 65 20 62 61 73 69 73 20  ate.  The basis 
61b0: 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
61c0: 20 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61    ** by prior ca
61d0: 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69  lls to "Configli
61e0: 73 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20  st_addbasis()". 
61f0: 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  */.  Configlist_
6200: 73 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62  sortbasis();.  b
6210: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62  p = Configlist_b
6220: 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65  asis();..  /* Ge
6230: 74 20 61 20 73 74 61 74 65 20 77 69 74 68 20 74  t a state with t
6240: 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f  he same basis */
6250: 0a 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66  .  stp = State_f
6260: 69 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73  ind(bp);.  if( s
6270: 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73  tp ){.    /* A s
6280: 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61  tate with the sa
6290: 6d 65 20 62 61 73 69 73 20 61 6c 72 65 61 64 79  me basis already
62a0: 20 65 78 69 73 74 73 21 20 20 43 6f 70 79 20 61   exists!  Copy a
62b0: 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  ll the follow-se
62c0: 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61  t.    ** propaga
62d0: 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20  tion links from 
62e0: 74 68 65 20 73 74 61 74 65 20 75 6e 64 65 72 20  the state under 
62f0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74  construction int
6300: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65  o the.    ** pre
6310: 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20  existing state, 
6320: 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
6330: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
6340: 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a  existing state *
6350: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e  /.    struct con
6360: 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20  fig *x, *y;.    
6370: 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d  for(x=bp, y=stp-
6380: 3e 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78  >bp; x && y; x=x
6390: 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a  ->bp, y=y->bp){.
63a0: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79        Plink_copy
63b0: 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c  (&y->bplp,x->bpl
63c0: 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f  p);.      Plink_
63d0: 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b  delete(x->fplp);
63e0: 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d  .      x->fplp =
63f0: 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20   x->bplp = 0;.  
6400: 20 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f    }.    cfp = Co
6410: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
6420: 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  );.    Configlis
6430: 74 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65  t_eat(cfp);.  }e
6440: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
6450: 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77   really is a new
6460: 20 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75   state.  Constru
6470: 63 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69  ct all the detai
6480: 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  ls */.    Config
6490: 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d  list_closure(lem
64a0: 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  p);    /* Comput
64b0: 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  e the configurat
64c0: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
64d0: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f     Configlist_so
64e0: 72 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt();           
64f0: 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66  /* Sort the conf
6500: 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72  iguration closur
6510: 65 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43  e */.    cfp = C
6520: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e  onfiglist_return
6530: 28 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70  ();   /* Get a p
6540: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
6550: 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20  nfig list */.   
6560: 20 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77   stp = State_new
6570: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ();           /*
6580: 20 41 20 6e 65 77 20 73 74 61 74 65 20 73 74 72   A new state str
6590: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65  ucture */.    Me
65a0: 6d 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a  moryCheck(stp);.
65b0: 20 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70      stp->bp = bp
65c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
65d0: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
65e0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62   configuration b
65f0: 61 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d  asis */.    stp-
6600: 3e 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20  >cfp = cfp;     
6610: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65           /* Reme
6620: 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75  mber the configu
6630: 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a  ration closure *
6640: 2f 0a 20 20 20 20 73 74 70 2d 3e 69 6e 64 65 78  /.    stp->index
6650: 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b   = lemp->nstate+
6660: 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73 74 61 74  +; /* Every stat
6670: 65 20 67 65 74 73 20 61 20 73 65 71 75 65 6e 63  e gets a sequenc
6680: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
6690: 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20  stp->ap = 0;    
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
66b0: 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e  No actions, yet.
66c0: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 5f 69 6e   */.    State_in
66d0: 73 65 72 74 28 73 74 70 2c 73 74 70 2d 3e 62 70  sert(stp,stp->bp
66e0: 29 3b 20 20 20 2f 2a 20 41 64 64 20 74 6f 20 74  );   /* Add to t
66f0: 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a  he state table *
6700: 2f 0a 20 20 20 20 62 75 69 6c 64 73 68 69 66 74  /.    buildshift
6710: 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20 20  s(lemp,stp);    
6720: 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c     /* Recursivel
6730: 79 20 63 6f 6d 70 75 74 65 20 73 75 63 63 65 73  y compute succes
6740: 73 6f 72 20 73 74 61 74 65 73 20 2a 2f 0a 20 20  sor states */.  
6750: 7d 0a 20 20 72 65 74 75 72 6e 20 73 74 70 3b 0a  }.  return stp;.
6760: 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  }../* Construct 
6770: 61 6c 6c 20 73 75 63 63 65 73 73 6f 72 20 73 74  all successor st
6780: 61 74 65 73 20 74 6f 20 74 68 65 20 67 69 76 65  ates to the give
6790: 6e 20 73 74 61 74 65 2e 20 20 41 20 22 73 75 63  n state.  A "suc
67a0: 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61 74 65  cessor".** state
67b0: 20 69 73 20 61 6e 79 20 73 74 61 74 65 20 77 68   is any state wh
67c0: 69 63 68 20 63 61 6e 20 62 65 20 72 65 61 63 68  ich can be reach
67d0: 65 64 20 62 79 20 61 20 73 68 69 66 74 20 61 63  ed by a shift ac
67e0: 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  tion..*/.PRIVATE
67f0: 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74   void buildshift
6800: 73 28 6c 65 6d 70 2c 73 74 70 29 0a 73 74 72 75  s(lemp,stp).stru
6810: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
6820: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
6830: 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74  p;     /* The st
6840: 61 74 65 20 66 72 6f 6d 20 77 68 69 63 68 20 73  ate from which s
6850: 75 63 63 65 73 73 6f 72 73 20 61 72 65 20 63 6f  uccessors are co
6860: 6d 70 75 74 65 64 20 2a 2f 0a 7b 0a 20 20 73 74  mputed */.{.  st
6870: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
6880: 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  ;  /* For loopin
6890: 67 20 74 68 72 75 20 74 68 65 20 63 6f 6e 66 69  g thru the confi
68a0: 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74  g closure of "st
68b0: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  p" */.  struct c
68c0: 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f 2a 20  onfig *bcfp; /* 
68d0: 46 6f 72 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f  For the inner lo
68e0: 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63 6c 6f  op on config clo
68f0: 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a 2f  sure of "stp" */
6900: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
6910: 20 2a 6e 65 77 3b 20 20 2f 2a 20 2a 2f 0a 20 20   *new;  /* */.  
6920: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
6930: 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66  p;   /* Symbol f
6940: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74  ollowing the dot
6950: 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   in configuratio
6960: 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20 73 74 72  n "cfp" */.  str
6970: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 73 70 3b  uct symbol *bsp;
6980: 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c    /* Symbol foll
6990: 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e  owing the dot in
69a0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22   configuration "
69b0: 62 63 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  bcfp" */.  struc
69c0: 74 20 73 74 61 74 65 20 2a 6e 65 77 73 74 70 3b  t state *newstp;
69d0: 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f   /* A pointer to
69e0: 20 61 20 73 75 63 63 65 73 73 6f 72 20 73 74 61   a successor sta
69f0: 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 61 63 68  te */..  /* Each
6a00: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62   configuration b
6a10: 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65 74 65 20  ecomes complete 
6a20: 61 66 74 65 72 20 69 74 20 63 6f 6e 74 69 62 75  after it contibu
6a30: 74 65 73 20 74 6f 20 61 20 73 75 63 63 65 73 73  tes to a success
6a40: 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20  or.  ** state.  
6a50: 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c 6c 20 63  Initially, all c
6a60: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 72  onfigurations ar
6a70: 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a  e incomplete */.
6a80: 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63    for(cfp=stp->c
6a90: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
6aa0: 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e 73 74 61  ->next) cfp->sta
6ab0: 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45  tus = INCOMPLETE
6ac0: 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  ;..  /* Loop thr
6ad0: 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66 69 67 75  ough all configu
6ae0: 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 73  rations of the s
6af0: 74 61 74 65 20 22 73 74 70 22 20 2a 2f 0a 20 20  tate "stp" */.  
6b00: 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70  for(cfp=stp->cfp
6b10: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
6b20: 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 63  next){.    if( c
6b30: 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50  fp->status==COMP
6b40: 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LETE ) continue;
6b50: 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75      /* Already u
6b60: 73 65 64 20 62 79 20 69 6e 6e 65 72 20 6c 6f 6f  sed by inner loo
6b70: 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 66 70  p */.    if( cfp
6b80: 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e  ->dot>=cfp->rp->
6b90: 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b  nrhs ) continue;
6ba0: 20 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66 74    /* Can't shift
6bb0: 20 74 68 69 73 20 63 6f 6e 66 69 67 20 2a 2f 0a   this config */.
6bc0: 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72      Configlist_r
6bd0: 65 73 65 74 28 29 3b 20 20 20 20 20 20 20 20 20  eset();         
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6bf0: 52 65 73 65 74 20 74 68 65 20 6e 65 77 20 63 6f  Reset the new co
6c00: 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20 20 20 20  nfig set */.    
6c10: 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d 3e 72 68  sp = cfp->rp->rh
6c20: 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20  s[cfp->dot];    
6c30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62           /* Symb
6c40: 6f 6c 20 61 66 74 65 72 20 74 68 65 20 64 6f 74  ol after the dot
6c50: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20   */..    /* For 
6c60: 65 76 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74  every configurat
6c70: 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74 65  ion in the state
6c80: 20 22 73 74 70 22 20 77 68 69 63 68 20 68 61 73   "stp" which has
6c90: 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22   the symbol "sp"
6ca0: 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  .    ** followin
6cb0: 67 20 69 74 73 20 64 6f 74 2c 20 61 64 64 20 74  g its dot, add t
6cc0: 68 65 20 73 61 6d 65 20 63 6f 6e 66 69 67 75 72  he same configur
6cd0: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 62 61 73  ation to the bas
6ce0: 69 73 20 73 65 74 20 75 6e 64 65 72 0a 20 20 20  is set under.   
6cf0: 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e   ** construction
6d00: 20 62 75 74 20 77 69 74 68 20 74 68 65 20 64 6f   but with the do
6d10: 74 20 73 68 69 66 74 65 64 20 6f 6e 65 20 73 79  t shifted one sy
6d20: 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72 69 67 68  mbol to the righ
6d30: 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 62 63  t. */.    for(bc
6d40: 66 70 3d 63 66 70 3b 20 62 63 66 70 3b 20 62 63  fp=cfp; bcfp; bc
6d50: 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  fp=bcfp->next){.
6d60: 20 20 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e        if( bcfp->
6d70: 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45  status==COMPLETE
6d80: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20   ) continue;    
6d90: 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20  /* Already used 
6da0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 63 66  */.      if( bcf
6db0: 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d 3e 72 70  p->dot>=bcfp->rp
6dc0: 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75  ->nrhs ) continu
6dd0: 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73 68 69 66  e; /* Can't shif
6de0: 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  t this one */.  
6df0: 20 20 20 20 62 73 70 20 3d 20 62 63 66 70 2d 3e      bsp = bcfp->
6e00: 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d 3e 64 6f  rp->rhs[bcfp->do
6e10: 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t];           /*
6e20: 20 47 65 74 20 73 79 6d 62 6f 6c 20 61 66 74 65   Get symbol afte
6e30: 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69  r dot */.      i
6e40: 66 28 20 62 73 70 21 3d 73 70 20 29 20 63 6f 6e  f( bsp!=sp ) con
6e50: 74 69 6e 75 65 3b 20 20 20 20 20 20 20 20 20 20  tinue;          
6e60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
6e70: 20 62 65 20 73 61 6d 65 20 61 73 20 66 6f 72 20   be same as for 
6e80: 22 63 66 70 22 20 2a 2f 0a 20 20 20 20 20 20 62  "cfp" */.      b
6e90: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f  cfp->status = CO
6ea0: 4d 50 4c 45 54 45 3b 20 20 20 20 20 20 20 20 20  MPLETE;         
6eb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b           /* Mark
6ec0: 20 74 68 69 73 20 63 6f 6e 66 69 67 20 61 73 20   this config as 
6ed0: 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 6e 65  used */.      ne
6ee0: 77 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61  w = Configlist_a
6ef0: 64 64 62 61 73 69 73 28 62 63 66 70 2d 3e 72 70  ddbasis(bcfp->rp
6f00: 2c 62 63 66 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20  ,bcfp->dot+1);. 
6f10: 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26       Plink_add(&
6f20: 6e 65 77 2d 3e 62 70 6c 70 2c 62 63 66 70 29 3b  new->bplp,bcfp);
6f30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
6f40: 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  et a pointer to 
6f50: 74 68 65 20 73 74 61 74 65 20 64 65 73 63 72 69  the state descri
6f60: 62 65 64 20 62 79 20 74 68 65 20 62 61 73 69 73  bed by the basis
6f70: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73   configuration s
6f80: 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  et.    ** constr
6f90: 75 63 74 65 64 20 69 6e 20 74 68 65 20 70 72 65  ucted in the pre
6fa0: 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20  ceding loop */. 
6fb0: 20 20 20 6e 65 77 73 74 70 20 3d 20 67 65 74 73     newstp = gets
6fc0: 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20 20 20  tate(lemp);..   
6fd0: 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20 22 6e   /* The state "n
6fe0: 65 77 73 74 70 22 20 69 73 20 72 65 61 63 68 65  ewstp" is reache
6ff0: 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65  d from the state
7000: 20 22 73 74 70 22 20 62 79 20 61 20 73 68 69 66   "stp" by a shif
7010: 74 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  t action.    ** 
7020: 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73  on the symbol "s
7030: 70 22 20 2a 2f 0a 20 20 20 20 41 63 74 69 6f 6e  p" */.    Action
7040: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48  _add(&stp->ap,SH
7050: 49 46 54 2c 73 70 2c 6e 65 77 73 74 70 29 3b 0a  IFT,sp,newstp);.
7060: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
7070: 73 74 72 75 63 74 20 74 68 65 20 70 72 6f 70 61  struct the propa
7080: 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a  gation links.*/.
7090: 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 6c  void FindLinks(l
70a0: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
70b0: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
70c0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   i;.  struct con
70d0: 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72  fig *cfp, *other
70e0: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
70f0: 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
7100: 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f  plink *plp;..  /
7110: 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e 67 20 64  * Housekeeping d
7120: 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20  etail:.  ** Add 
7130: 74 6f 20 65 76 65 72 79 20 70 72 6f 70 61 67 61  to every propaga
7140: 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65  te link a pointe
7150: 72 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74  r back to the st
7160: 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63  ate to.  ** whic
7170: 68 20 74 68 65 20 6c 69 6e 6b 20 69 73 20 61 74  h the link is at
7180: 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72  tached. */.  for
7190: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
71a0: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
71b0: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
71c0: 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63  ed[i];.    for(c
71d0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
71e0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
71f0: 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 70  {.      cfp->stp
7200: 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20   = stp;.    }.  
7210: 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20  }..  /* Convert 
7220: 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e  all backlinks in
7230: 74 6f 20 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73  to forward links
7240: 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77  .  Only the forw
7250: 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61  ard.  ** links a
7260: 72 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 66  re used in the f
7270: 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74  ollow-set comput
7280: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28  ation. */.  for(
7290: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
72a0: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
72b0: 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
72c0: 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66  d[i];.    for(cf
72d0: 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b  p=stp->cfp; cfp;
72e0: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
72f0: 0a 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63  .      for(plp=c
7300: 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70  fp->bplp; plp; p
7310: 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20  lp=plp->next){. 
7320: 20 20 20 20 20 20 20 6f 74 68 65 72 20 3d 20 70         other = p
7330: 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20 20 20 20  lp->cfp;.       
7340: 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65   Plink_add(&othe
7350: 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20  r->fplp,cfp);.  
7360: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
7370: 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c  }../* Compute al
7380: 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a  l followsets..**
7390: 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20  .** A followset 
73a0: 69 73 20 74 68 65 20 73 65 74 20 6f 66 20 61 6c  is the set of al
73b0: 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20  l symbols which 
73c0: 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61  can come immedia
73d0: 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72 20 61 20  tely.** after a 
73e0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a  configuration..*
73f0: 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f  /.void FindFollo
7400: 77 53 65 74 73 28 6c 65 6d 70 29 0a 73 74 72 75  wSets(lemp).stru
7410: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
7420: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
7430: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
7440: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
7450: 2a 70 6c 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67  *plp;.  int prog
7460: 72 65 73 73 3b 0a 20 20 69 6e 74 20 63 68 61 6e  ress;.  int chan
7470: 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ge;..  for(i=0; 
7480: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
7490: 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72 28 63 66  i++){.    for(cf
74a0: 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  p=lemp->sorted[i
74b0: 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  ]->cfp; cfp; cfp
74c0: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
74d0: 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d     cfp->status =
74e0: 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20   INCOMPLETE;.   
74f0: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 64 6f 7b 0a   }.  }.  .  do{.
7500: 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30      progress = 0
7510: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
7520: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
7530: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 63  ++){.      for(c
7540: 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  fp=lemp->sorted[
7550: 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  i]->cfp; cfp; cf
7560: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
7570: 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 73        if( cfp->s
7580: 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20  tatus==COMPLETE 
7590: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
75a0: 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d      for(plp=cfp-
75b0: 3e 66 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d  >fplp; plp; plp=
75c0: 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  plp->next){.    
75d0: 20 20 20 20 20 20 63 68 61 6e 67 65 20 3d 20 53        change = S
75e0: 65 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e 63 66 70  etUnion(plp->cfp
75f0: 2d 3e 66 77 73 2c 63 66 70 2d 3e 66 77 73 29 3b  ->fws,cfp->fws);
7600: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
7610: 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 20 20 20  hange ){.       
7620: 20 20 20 20 20 70 6c 70 2d 3e 63 66 70 2d 3e 73       plp->cfp->s
7630: 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45  tatus = INCOMPLE
7640: 54 45 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE;.            
7650: 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 09 20  progress = 1;.. 
7660: 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20 20 63 66   }..}.        cf
7670: 70 2d 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50  p->status = COMP
7680: 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LETE;.      }.  
7690: 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72    }.  }while( pr
76a0: 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a 73 74 61  ogress );.}..sta
76b0: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f  tic int resolve_
76c0: 63 6f 6e 66 6c 69 63 74 28 29 3b 0a 0a 2f 2a 20  conflict();../* 
76d0: 43 6f 6d 70 75 74 65 20 74 68 65 20 72 65 64 75  Compute the redu
76e0: 63 65 20 61 63 74 69 6f 6e 73 2c 20 61 6e 64 20  ce actions, and 
76f0: 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74  resolve conflict
7700: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 41  s..*/.void FindA
7710: 63 74 69 6f 6e 73 28 6c 65 6d 70 29 0a 73 74 72  ctions(lemp).str
7720: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
7730: 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20  .{.  int i,j;.  
7740: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
7750: 66 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  fp;.  struct sta
7760: 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63  te *stp;.  struc
7770: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
7780: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
7790: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f  ..  /* Add all o
77a0: 66 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  f the reduce act
77b0: 69 6f 6e 73 20 0a 20 20 2a 2a 20 41 20 72 65 64  ions .  ** A red
77c0: 75 63 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64  uce action is ad
77d0: 64 65 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65  ded for each ele
77e0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ment of the foll
77f0: 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20  owset of.  ** a 
7800: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68  configuration wh
7810: 69 63 68 20 68 61 73 20 69 74 73 20 64 6f 74 20  ich has its dot 
7820: 61 74 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  at the extreme r
7830: 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ight..  */.  for
7840: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
7850: 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a  tate; i++){   /*
7860: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73   Loop over all s
7870: 74 61 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70  tates */.    stp
7880: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
7890: 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d  i];.    for(cfp=
78a0: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
78b0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20  fp=cfp->next){  
78c0: 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
78d0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
78e0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 63 66 70  */.      if( cfp
78f0: 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d  ->rp->nrhs==cfp-
7900: 3e 64 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f  >dot ){        /
7910: 2a 20 49 73 20 64 6f 74 20 61 74 20 65 78 74 72  * Is dot at extr
7920: 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20  eme right? */.  
7930: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
7940: 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
7950: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
7960: 20 20 69 66 28 20 53 65 74 46 69 6e 64 28 63 66    if( SetFind(cf
7970: 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20  p->fws,j) ){.   
7980: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
7990: 61 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20  a reduce action 
79a0: 74 6f 20 74 68 65 20 73 74 61 74 65 20 22 73 74  to the state "st
79b0: 70 22 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65  p" which will re
79c0: 64 75 63 65 20 62 79 20 74 68 65 0a 20 20 20 20  duce by the.    
79d0: 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20          ** rule 
79e0: 22 63 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65  "cfp->rp" if the
79f0: 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f   lookahead symbo
7a00: 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62  l is "lemp->symb
7a10: 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20  ols[j]" */.     
7a20: 20 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64         Action_ad
7a30: 64 28 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43  d(&stp->ap,REDUC
7a40: 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  E,lemp->symbols[
7a50: 6a 5d 2c 63 66 70 2d 3e 72 70 29 3b 0a 20 20 20  j],cfp->rp);.   
7a60: 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20         }..}.    
7a70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
7a80: 20 2f 2a 20 41 64 64 20 74 68 65 20 61 63 63 65   /* Add the acce
7a90: 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20  pting token */. 
7aa0: 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74   if( lemp->start
7ab0: 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d   ){.    sp = Sym
7ac0: 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73  bol_find(lemp->s
7ad0: 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73  tart);.    if( s
7ae0: 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d 70  p==0 ) sp = lemp
7af0: 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d  ->rule->lhs;.  }
7b00: 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c  else{.    sp = l
7b10: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a  emp->rule->lhs;.
7b20: 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20 74 6f 20    }.  /* Add to 
7b30: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20  the first state 
7b40: 28 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73  (which is always
7b50: 20 74 68 65 20 73 74 61 72 74 69 6e 67 20 73 74   the starting st
7b60: 61 74 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ate of the.  ** 
7b70: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
7b80: 68 69 6e 65 29 20 61 6e 20 61 63 74 69 6f 6e 20  hine) an action 
7b90: 74 6f 20 41 43 43 45 50 54 20 69 66 20 74 68 65  to ACCEPT if the
7ba0: 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20 74 68   lookahead is th
7bb0: 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6e 6f 6e  e.  ** start non
7bc0: 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20 20  terminal.  */.  
7bd0: 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c 65 6d 70  Action_add(&lemp
7be0: 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e 61 70 2c  ->sorted[0]->ap,
7bf0: 41 43 43 45 50 54 2c 73 70 2c 30 29 3b 0a 0a 20  ACCEPT,sp,0);.. 
7c00: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6e 66   /* Resolve conf
7c10: 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69  licts */.  for(i
7c20: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
7c30: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
7c40: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c  ruct action *ap,
7c50: 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74 72 75 63   *nap;.    struc
7c60: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20  t state *stp;.  
7c70: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
7c80: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 61 73 73  rted[i];.    ass
7c90: 65 72 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 0a  ert( stp->ap );.
7ca0: 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63      stp->ap = Ac
7cb0: 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61  tion_sort(stp->a
7cc0: 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73  p);.    for(ap=s
7cd0: 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61 70  tp->ap; ap && ap
7ce0: 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e 6e  ->next; ap=ap->n
7cf0: 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ext){.      for(
7d00: 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e 61  nap=ap->next; na
7d10: 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61 70  p && nap->sp==ap
7d20: 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e 6e  ->sp; nap=nap->n
7d30: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 2f  ext){.         /
7d40: 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69 6f 6e  * The two action
7d50: 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61 70 22  s "ap" and "nap"
7d60: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6c   have the same l
7d70: 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 20 20  ookahead..      
7d80: 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74     ** Figure out
7d90: 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f 75 6c   which one shoul
7da0: 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20 20 20  d be used */.   
7db0: 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f 6e        lemp->ncon
7dc0: 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76 65  flict += resolve
7dd0: 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61 70  _conflict(ap,nap
7de0: 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 29 3b 0a  ,lemp->errsym);.
7df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7e00: 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20 61  }..  /* Report a
7e10: 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63 68  n error for each
7e20: 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20 6e   rule that can n
7e30: 65 76 65 72 20 62 65 20 72 65 64 75 63 65 64 2e  ever be reduced.
7e40: 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
7e50: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
7e60: 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63 61  rp->next) rp->ca
7e70: 6e 52 65 64 75 63 65 20 3d 20 42 5f 46 41 4c 53  nReduce = B_FALS
7e80: 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  E;.  for(i=0; i<
7e90: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
7ea0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61  +){.    struct a
7eb0: 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66  ction *ap;.    f
7ec0: 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  or(ap=lemp->sort
7ed0: 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61  ed[i]->ap; ap; a
7ee0: 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
7ef0: 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
7f00: 3d 52 45 44 55 43 45 20 29 20 61 70 2d 3e 78 2e  =REDUCE ) ap->x.
7f10: 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20  rp->canReduce = 
7f20: 42 5f 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  B_TRUE;.    }.  
7f30: 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  }.  for(rp=lemp-
7f40: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
7f50: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
7f60: 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 29   rp->canReduce )
7f70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45   continue;.    E
7f80: 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
7f90: 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
7fa0: 69 6e 65 2c 22 54 68 69 73 20 72 75 6c 65 20 63  ine,"This rule c
7fb0: 61 6e 20 6e 6f 74 20 62 65 20 72 65 64 75 63 65  an not be reduce
7fc0: 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70  d.\n");.    lemp
7fd0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
7fe0: 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20  }.}../* Resolve 
7ff0: 61 20 63 6f 6e 66 6c 69 63 74 20 62 65 74 77 65  a conflict betwe
8000: 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e  en the two given
8010: 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68   actions.  If th
8020: 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61  e.** conflict ca
8030: 6e 27 74 20 62 65 20 72 65 73 6f 6c 76 65 2c 20  n't be resolve, 
8040: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
8050: 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52  .**.** NO LONGER
8060: 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72   TRUE:.**   To r
8070: 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63  esolve a conflic
8080: 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f  t, first look to
8090: 20 73 65 65 20 69 66 20 65 69 74 68 65 72 20 61   see if either a
80a0: 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e  ction.**   is on
80b0: 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e 20   an error rule. 
80c0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
80d0: 61 6b 65 20 74 68 65 20 61 63 74 69 6f 6e 20 77  ake the action w
80e0: 68 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74  hich.**   is not
80f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
8100: 20 74 68 65 20 65 72 72 6f 72 20 72 75 6c 65 2e   the error rule.
8110: 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f 72 20    If neither or 
8120: 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e  both.**   action
8130: 73 20 61 72 65 20 61 73 73 6f 63 69 61 74 65 64  s are associated
8140: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 72   with an error r
8150: 75 6c 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  ule, then try to
8160: 0a 2a 2a 20 20 20 75 73 65 20 70 72 65 63 65 64  .**   use preced
8170: 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  ence to resolve 
8180: 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a  the conflict..**
8190: 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 61 63  .** If either ac
81a0: 74 69 6f 6e 20 69 73 20 61 20 53 48 49 46 54 2c  tion is a SHIFT,
81b0: 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65   then it must be
81c0: 20 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66   apx.  This.** f
81d0: 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f  unction won't wo
81e0: 72 6b 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d  rk if apx->type=
81f0: 3d 52 45 44 55 43 45 20 61 6e 64 20 61 70 79 2d  =REDUCE and apy-
8200: 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f  >type==SHIFT..*/
8210: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
8220: 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 78  lve_conflict(apx
8230: 2c 61 70 79 2c 65 72 72 73 79 6d 29 0a 73 74 72  ,apy,errsym).str
8240: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 78 3b  uct action *apx;
8250: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  .struct action *
8260: 61 70 79 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  apy;.struct symb
8270: 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a  ol *errsym;   /*
8280: 20 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f   The error symbo
8290: 6c 20 28 69 66 20 64 65 66 69 6e 65 64 2e 20 20  l (if defined.  
82a0: 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 29 20  NULL otherwise) 
82b0: 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  */.{.  struct sy
82c0: 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79 3b  mbol *spx, *spy;
82d0: 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20  .  int errcnt = 
82e0: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70 78  0;.  assert( apx
82f0: 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29 3b  ->sp==apy->sp );
8300: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 74    /* Otherwise t
8310: 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e 6f  here would be no
8320: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69   conflict */.  i
8330: 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48  f( apx->type==SH
8340: 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65  IFT && apy->type
8350: 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  ==REDUCE ){.    
8360: 73 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b 0a 20  spx = apx->sp;. 
8370: 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e     spy = apy->x.
8380: 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20  rp->precsym;.   
8390: 20 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c 20 73   if( spy==0 || s
83a0: 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70  px->prec<0 || sp
83b0: 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20 20 20  y->prec<0 ){.   
83c0: 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67 68     /* Not enough
83d0: 20 70 72 65 63 65 64 65 6e 63 65 20 69 6e 66 6f   precedence info
83e0: 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  rmation. */.    
83f0: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 43 4f    apy->type = CO
8400: 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72  NFLICT;.      er
8410: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  rcnt++;.    }els
8420: 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e  e if( spx->prec>
8430: 73 70 79 2d 3e 70 72 65 63 20 29 7b 20 20 20 20  spy->prec ){    
8440: 2f 2a 20 4c 6f 77 65 72 20 70 72 65 63 65 64 65  /* Lower precede
8450: 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20  nce wins */.    
8460: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
8470: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
8480: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
8490: 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec<spy->prec ){.
84a0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
84b0: 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = SH_RESOLVED;. 
84c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
84d0: 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65  ->prec==spy->pre
84e0: 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d  c && spx->assoc=
84f0: 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20 55 73 65  =RIGHT ){ /* Use
8500: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
8510: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52     apy->type = R
8520: 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20 20 20  D_RESOLVED;     
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 6f 63          /* assoc
8550: 69 61 74 69 76 69 74 79 20 2a 2f 0a 20 20 20 20  iativity */.    
8560: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
8570: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26  rec==spy->prec &
8580: 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45  & spx->assoc==LE
8590: 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65  FT ){  /* to bre
85a0: 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20 20 20  ak tie */.      
85b0: 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52  apx->type = SH_R
85c0: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
85d0: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
85e0: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
85f0: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
8600: 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20  ssoc==NONE );.  
8610: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
8620: 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20  CONFLICT;.      
8630: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a  errcnt++;.    }.
8640: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70 78 2d    }else if( apx-
8650: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
8660: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55   apy->type==REDU
8670: 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d 20  CE ){.    spx = 
8680: 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apx->x.rp->precs
8690: 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70  ym;.    spy = ap
86a0: 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d  y->x.rp->precsym
86b0: 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d 3d 30  ;.    if( spx==0
86c0: 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70   || spy==0 || sp
86d0: 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20 20  x->prec<0 ||.   
86e0: 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c 20   spy->prec<0 || 
86f0: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
8700: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
8710: 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e 46 4c 49  y->type = CONFLI
8720: 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74  CT;.      errcnt
8730: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
8740: 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79 2d  ( spx->prec>spy-
8750: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
8760: 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45  py->type = RD_RE
8770: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SOLVED;.    }els
8780: 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3c  e if( spx->prec<
8790: 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20  spy->prec ){.   
87a0: 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 52     apx->type = R
87b0: 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  D_RESOLVED;.    
87c0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
87d0: 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 61 70  ssert( .      ap
87e0: 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f  x->type==SH_RESO
87f0: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
8800: 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f  x->type==RD_RESO
8810: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
8820: 78 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43  x->type==CONFLIC
8830: 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e  T ||.      apy->
8840: 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45  type==SH_RESOLVE
8850: 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e  D ||.      apy->
8860: 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45  type==RD_RESOLVE
8870: 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e  D ||.      apy->
8880: 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43 54 0a 20  type==CONFLICT. 
8890: 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65     );.    /* The
88a0: 20 52 45 44 55 43 45 2f 53 48 49 46 54 20 63 61   REDUCE/SHIFT ca
88b0: 73 65 20 63 61 6e 6e 6f 74 20 68 61 70 70 65 6e  se cannot happen
88c0: 20 62 65 63 61 75 73 65 20 53 48 49 46 54 73 20   because SHIFTs 
88d0: 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20 20 20 20  come before.    
88e0: 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e 20 74 68  ** REDUCEs on th
88f0: 65 20 6c 69 73 74 2e 20 20 49 66 20 77 65 20 72  e list.  If we r
8900: 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 20  each this point 
8910: 69 74 20 6d 75 73 74 20 62 65 20 62 65 63 61 75  it must be becau
8920: 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  se.    ** the pa
8930: 72 73 65 72 20 63 6f 6e 66 6c 69 63 74 20 68 61  rser conflict ha
8940: 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  d already been r
8950: 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 7d 0a  esolved. */.  }.
8960: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b    return errcnt;
8970: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
8980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
8990: 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c  he file "configl
89a0: 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ist.c" *********
89b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
89c0: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
89d0: 20 74 6f 20 70 72 6f 63 65 73 73 69 6e 67 20 61   to processing a
89e0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c   configuration l
89f0: 69 73 74 20 61 6e 64 20 62 75 69 6c 64 69 6e 67  ist and building
8a00: 20 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e 20 74   a state.** in t
8a10: 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
8a20: 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73  generator..*/..s
8a30: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
8a40: 66 69 67 20 2a 66 72 65 65 6c 69 73 74 20 3d 20  fig *freelist = 
8a50: 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  0;      /* List 
8a60: 6f 66 20 66 72 65 65 20 63 6f 6e 66 69 67 75 72  of free configur
8a70: 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
8a80: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
8a90: 63 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  current = 0;    
8aa0: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73     /* Top of lis
8ab0: 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69  t of configurati
8ac0: 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ons */.static st
8ad0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 63 75  ruct config **cu
8ae0: 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20 20 20  rrentend = 0;   
8af0: 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73 74 20  /* Last on list 
8b00: 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74  of configs */.st
8b10: 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66  atic struct conf
8b20: 69 67 20 2a 62 61 73 69 73 20 3d 20 30 3b 20 20  ig *basis = 0;  
8b30: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
8b40: 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63   list of basis c
8b50: 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63  onfigs */.static
8b60: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
8b70: 2a 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 20 20  *basisend = 0;  
8b80: 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 69 73     /* End of lis
8b90: 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69  t of basis confi
8ba0: 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e  gs */../* Return
8bb0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
8bc0: 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  new configuratio
8bd0: 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72  n */.PRIVATE str
8be0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63  uct config *newc
8bf0: 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74 72 75 63  onfig(){.  struc
8c00: 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 3b 0a 20  t config *new;. 
8c10: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
8c20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
8c30: 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 33 3b 0a     int amt = 3;.
8c40: 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20 28      freelist = (
8c50: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
8c60: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
8c70: 74 72 75 63 74 20 63 6f 6e 66 69 67 29 2a 61 6d  truct config)*am
8c80: 74 20 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65  t );.    if( fre
8c90: 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
8ca0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
8cb0: 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  ,"Unable to allo
8cc0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20  cate memory for 
8cd0: 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74  a new configurat
8ce0: 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78  ion.");.      ex
8cf0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
8d00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d   for(i=0; i<amt-
8d10: 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74  1; i++) freelist
8d20: 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65  [i].next = &free
8d30: 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66  list[i+1];.    f
8d40: 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e  reelist[amt-1].n
8d50: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e  ext = 0;.  }.  n
8d60: 65 77 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20  ew = freelist;. 
8d70: 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65   freelist = free
8d80: 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65  list->next;.  re
8d90: 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20  turn new;.}../* 
8da0: 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  The configuratio
8db0: 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f  n "old" is no lo
8dc0: 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a 50 52 49  nger used */.PRI
8dd0: 56 41 54 45 20 76 6f 69 64 20 64 65 6c 65 74 65  VATE void delete
8de0: 63 6f 6e 66 69 67 28 6f 6c 64 29 0a 73 74 72 75  config(old).stru
8df0: 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a  ct config *old;.
8e00: 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20  {.  old->next = 
8e10: 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65  freelist;.  free
8e20: 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f  list = old;.}../
8e30: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68  * Initialized th
8e40: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
8e50: 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a  list builder */.
8e60: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
8e70: 69 6e 69 74 28 29 7b 0a 20 20 63 75 72 72 65 6e  init(){.  curren
8e80: 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74  t = 0;.  current
8e90: 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a  end = &current;.
8ea0: 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62    basis = 0;.  b
8eb0: 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73  asisend = &basis
8ec0: 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ;.  Configtable_
8ed0: 69 6e 69 74 28 29 3b 0a 20 20 72 65 74 75 72 6e  init();.  return
8ee0: 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69  ;.}../* Initiali
8ef0: 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72  zed the configur
8f00: 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64  ation list build
8f10: 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  er */.void Confi
8f20: 67 6c 69 73 74 5f 72 65 73 65 74 28 29 7b 0a 20  glist_reset(){. 
8f30: 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20   current = 0;.  
8f40: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75  currentend = &cu
8f50: 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d  rrent;.  basis =
8f60: 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d   0;.  basisend =
8f70: 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69   &basis;.  Confi
8f80: 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 30 29 3b  gtable_clear(0);
8f90: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
8fa0: 20 41 64 64 20 61 6e 6f 74 68 65 72 20 63 6f 6e   Add another con
8fb0: 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68  figuration to th
8fc0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
8fd0: 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63  list */.struct c
8fe0: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
8ff0: 74 5f 61 64 64 28 72 70 2c 64 6f 74 29 0a 73 74  t_add(rp,dot).st
9000: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20  ruct rule *rp;  
9010: 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20 2a 2f    /* The rule */
9020: 0a 69 6e 74 20 64 6f 74 3b 20 20 20 20 20 20 20  .int dot;       
9030: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
9040: 74 6f 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  to the RHS of th
9050: 65 20 72 75 6c 65 20 77 68 65 72 65 20 74 68 65  e rule where the
9060: 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a 7b 0a 20   dot goes */.{. 
9070: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9080: 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61  cfp, model;..  a
9090: 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e  ssert( currenten
90a0: 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e  d!=0 );.  model.
90b0: 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c  rp = rp;.  model
90c0: 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66  .dot = dot;.  cf
90d0: 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  p = Configtable_
90e0: 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20  find(&model);.  
90f0: 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20  if( cfp==0 ){.  
9100: 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69    cfp = newconfi
9110: 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70  g();.    cfp->rp
9120: 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e   = rp;.    cfp->
9130: 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63  dot = dot;.    c
9140: 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77  fp->fws = SetNew
9150: 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70  ();.    cfp->stp
9160: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66   = 0;.    cfp->f
9170: 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20  plp = cfp->bplp 
9180: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65  = 0;.    cfp->ne
9190: 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  xt = 0;.    cfp-
91a0: 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75  >bp = 0;.    *cu
91b0: 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a  rrentend = cfp;.
91c0: 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d      currentend =
91d0: 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20   &cfp->next;.   
91e0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
91f0: 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20  ert(cfp);.  }.  
9200: 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f  return cfp;.}../
9210: 2a 20 41 64 64 20 61 20 62 61 73 69 73 20 63 6f  * Add a basis co
9220: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74  nfiguration to t
9230: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
9240: 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20   list */.struct 
9250: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
9260: 73 74 5f 61 64 64 62 61 73 69 73 28 72 70 2c 64  st_addbasis(rp,d
9270: 6f 74 29 0a 73 74 72 75 63 74 20 72 75 6c 65 20  ot).struct rule 
9280: 2a 72 70 3b 0a 69 6e 74 20 64 6f 74 3b 0a 7b 0a  *rp;.int dot;.{.
9290: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
92a0: 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20  *cfp, model;..  
92b0: 61 73 73 65 72 74 28 20 62 61 73 69 73 65 6e 64  assert( basisend
92c0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
92d0: 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29   currentend!=0 )
92e0: 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72  ;.  model.rp = r
92f0: 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d  p;.  model.dot =
9300: 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f   dot;.  cfp = Co
9310: 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 26  nfigtable_find(&
9320: 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20 63 66  model);.  if( cf
9330: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66 70 20  p==0 ){.    cfp 
9340: 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20  = newconfig();. 
9350: 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b     cfp->rp = rp;
9360: 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20  .    cfp->dot = 
9370: 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77  dot;.    cfp->fw
9380: 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20  s = SetNew();.  
9390: 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a    cfp->stp = 0;.
93a0: 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20      cfp->fplp = 
93b0: 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20  cfp->bplp = 0;. 
93c0: 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30     cfp->next = 0
93d0: 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20 3d 20  ;.    cfp->bp = 
93e0: 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e 74 65  0;.    *currente
93f0: 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 63 75  nd = cfp;.    cu
9400: 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d  rrentend = &cfp-
9410: 3e 6e 65 78 74 3b 0a 20 20 20 20 2a 62 61 73 69  >next;.    *basi
9420: 73 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20  send = cfp;.    
9430: 62 61 73 69 73 65 6e 64 20 3d 20 26 63 66 70 2d  basisend = &cfp-
9440: 3e 62 70 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74  >bp;.    Configt
9450: 61 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29  able_insert(cfp)
9460: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
9470: 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74  fp;.}../* Comput
9480: 65 20 74 68 65 20 63 6c 6f 73 75 72 65 20 6f 66  e the closure of
9490: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
94a0: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20  on list */.void 
94b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
94c0: 72 65 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  re(lemp).struct 
94d0: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
94e0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
94f0: 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b 0a 20 20  cfp, *newcfp;.  
9500: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
9510: 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74 72 75 63   *newrp;.  struc
9520: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 20 2a 78  t symbol *sp, *x
9530: 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 64 6f 74  sp;.  int i, dot
9540: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
9550: 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20  rentend!=0 );.  
9560: 66 6f 72 28 63 66 70 3d 63 75 72 72 65 6e 74 3b  for(cfp=current;
9570: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
9580: 65 78 74 29 7b 0a 20 20 20 20 72 70 20 3d 20 63  ext){.    rp = c
9590: 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64 6f 74 20  fp->rp;.    dot 
95a0: 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20 20 20 20  = cfp->dot;.    
95b0: 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e 6e 72 68  if( dot>=rp->nrh
95c0: 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  s ) continue;.  
95d0: 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 64    sp = rp->rhs[d
95e0: 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  ot];.    if( sp-
95f0: 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e  >type==NONTERMIN
9600: 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  AL ){.      if( 
9610: 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26 26 20 73  sp->rule==0 && s
9620: 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20  p!=lemp->errsym 
9630: 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
9640: 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
9650: 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22 4e 6f 6e  me,rp->line,"Non
9660: 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73 5c 22 20  terminal \"%s\" 
9670: 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e 22 2c 0a  has no rules.",.
9680: 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 6e 61            sp->na
9690: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d  me);.        lem
96a0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
96b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
96c0: 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75 6c 65 3b  (newrp=sp->rule;
96d0: 20 6e 65 77 72 70 3b 20 6e 65 77 72 70 3d 6e 65   newrp; newrp=ne
96e0: 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20  wrp->nextlhs){. 
96f0: 20 20 20 20 20 20 20 6e 65 77 63 66 70 20 3d 20         newcfp = 
9700: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 6e  Configlist_add(n
9710: 65 77 72 70 2c 30 29 3b 0a 20 20 20 20 20 20 20  ewrp,0);.       
9720: 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b 20 69 3c   for(i=dot+1; i<
9730: 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
9740: 20 20 20 20 20 20 20 20 20 20 78 73 70 20 3d 20            xsp = 
9750: 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
9760: 20 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e 74        if( xsp->t
9770: 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b  ype==TERMINAL ){
9780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  .            Set
9790: 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c  Add(newcfp->fws,
97a0: 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  xsp->index);.   
97b0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
97c0: 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20  .  }else{.      
97d0: 20 20 20 20 20 20 53 65 74 55 6e 69 6f 6e 28 6e        SetUnion(n
97e0: 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e  ewcfp->fws,xsp->
97f0: 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20  firstset);.     
9800: 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e         if( xsp->
9810: 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45 20  lambda==B_FALSE 
9820: 29 20 62 72 65 61 6b 3b 0a 09 20 20 7d 0a 09 7d  ) break;..  }..}
9830: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
9840: 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c 69 6e 6b  rp->nrhs ) Plink
9850: 5f 61 64 64 28 26 63 66 70 2d 3e 66 70 6c 70 2c  _add(&cfp->fplp,
9860: 6e 65 77 63 66 70 29 3b 0a 20 20 20 20 20 20 7d  newcfp);.      }
9870: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9880: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20  urn;.}../* Sort 
9890: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
98a0: 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43  n list */.void C
98b0: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29  onfiglist_sort()
98c0: 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 28 73  {.  current = (s
98d0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d  truct config *)m
98e0: 73 6f 72 74 28 63 75 72 72 65 6e 74 2c 26 28 63  sort(current,&(c
98f0: 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29 2c 43 6f  urrent->next),Co
9900: 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63 75 72 72  nfigcmp);.  curr
9910: 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65  entend = 0;.  re
9920: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  turn;.}../* Sort
9930: 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   the basis confi
9940: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
9950: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
9960: 5f 73 6f 72 74 62 61 73 69 73 28 29 7b 0a 20 20  _sortbasis(){.  
9970: 62 61 73 69 73 20 3d 20 28 73 74 72 75 63 74 20  basis = (struct 
9980: 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28 63  config *)msort(c
9990: 75 72 72 65 6e 74 2c 26 28 63 75 72 72 65 6e 74  urrent,&(current
99a0: 2d 3e 62 70 29 2c 43 6f 6e 66 69 67 63 6d 70 29  ->bp),Configcmp)
99b0: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 30  ;.  basisend = 0
99c0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
99d0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
99e0: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
99f0: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  f the configurat
9a00: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  ion list and.** 
9a10: 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20 2a  reset the list *
9a20: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
9a30: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75  *Configlist_retu
9a40: 72 6e 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63  rn(){.  struct c
9a50: 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c  onfig *old;.  ol
9a60: 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a 20 20 63  d = current;.  c
9a70: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75  urrent = 0;.  cu
9a80: 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20  rrentend = 0;.  
9a90: 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f  return old;.}../
9aa0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
9ab0: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
9ac0: 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  f the configurat
9ad0: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  ion list and.** 
9ae0: 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20 2a  reset the list *
9af0: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
9b00: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69  *Configlist_basi
9b10: 73 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  s(){.  struct co
9b20: 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64  nfig *old;.  old
9b30: 20 3d 20 62 61 73 69 73 3b 0a 20 20 62 61 73 69   = basis;.  basi
9b40: 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e  s = 0;.  basisen
9b50: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
9b60: 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20  old;.}../* Free 
9b70: 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  all elements of 
9b80: 74 68 65 20 67 69 76 65 6e 20 63 6f 6e 66 69 67  the given config
9b90: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
9ba0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
9bb0: 65 61 74 28 63 66 70 29 0a 73 74 72 75 63 74 20  eat(cfp).struct 
9bc0: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20  config *cfp;.{. 
9bd0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9be0: 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f 72 28 3b  nextcfp;.  for(;
9bf0: 20 63 66 70 3b 20 63 66 70 3d 6e 65 78 74 63 66   cfp; cfp=nextcf
9c00: 70 29 7b 0a 20 20 20 20 6e 65 78 74 63 66 70 20  p){.    nextcfp 
9c10: 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  = cfp->next;.   
9c20: 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 66 70   assert( cfp->fp
9c30: 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  lp==0 );.    ass
9c40: 65 72 74 28 20 63 66 70 2d 3e 62 70 6c 70 3d 3d  ert( cfp->bplp==
9c50: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 63 66 70  0 );.    if( cfp
9c60: 2d 3e 66 77 73 20 29 20 53 65 74 46 72 65 65 28  ->fws ) SetFree(
9c70: 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 64  cfp->fws);.    d
9c80: 65 6c 65 74 65 63 6f 6e 66 69 67 28 63 66 70 29  eleteconfig(cfp)
9c90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a  ;.  }.  return;.
9ca0: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
9cb0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
9cc0: 6c 65 20 22 65 72 72 6f 72 2e 63 22 20 2a 2a 2a  le "error.c" ***
9cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
9cf0: 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70  /*.** Code for p
9d00: 72 69 6e 74 69 6e 67 20 65 72 72 6f 72 20 6d 65  rinting error me
9d10: 73 73 61 67 65 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69  ssage..*/../* Fi
9d20: 6e 64 20 61 20 67 6f 6f 64 20 70 6c 61 63 65 20  nd a good place 
9d30: 74 6f 20 62 72 65 61 6b 20 22 6d 73 67 22 20 73  to break "msg" s
9d40: 6f 20 74 68 61 74 20 69 74 73 20 6c 65 6e 67 74  o that its lengt
9d50: 68 20 69 73 20 61 74 20 6c 65 61 73 74 20 22 6d  h is at least "m
9d60: 69 6e 22 0a 2a 2a 20 62 75 74 20 6e 6f 20 6d 6f  in".** but no mo
9d70: 72 65 20 74 68 61 6e 20 22 6d 61 78 22 2e 20 20  re than "max".  
9d80: 4d 61 6b 65 20 74 68 65 20 70 6f 69 6e 74 20 61  Make the point a
9d90: 73 20 63 6c 6f 73 65 20 74 6f 20 6d 61 78 20 61  s close to max a
9da0: 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73  s possible..*/.s
9db0: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 62 72  tatic int findbr
9dc0: 65 61 6b 28 6d 73 67 2c 6d 69 6e 2c 6d 61 78 29  eak(msg,min,max)
9dd0: 0a 63 68 61 72 20 2a 6d 73 67 3b 0a 69 6e 74 20  .char *msg;.int 
9de0: 6d 69 6e 3b 0a 69 6e 74 20 6d 61 78 3b 0a 7b 0a  min;.int max;.{.
9df0: 20 20 69 6e 74 20 69 2c 73 70 6f 74 3b 0a 20 20    int i,spot;.  
9e00: 63 68 61 72 20 63 3b 0a 20 20 66 6f 72 28 69 3d  char c;.  for(i=
9e10: 73 70 6f 74 3d 6d 69 6e 3b 20 69 3c 3d 6d 61 78  spot=min; i<=max
9e20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 20 3d 20  ; i++){.    c = 
9e30: 6d 73 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  msg[i];.    if( 
9e40: 63 3d 3d 27 5c 74 27 20 29 20 6d 73 67 5b 69 5d  c=='\t' ) msg[i]
9e50: 20 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28 20   = ' ';.    if( 
9e60: 63 3d 3d 27 5c 6e 27 20 29 7b 20 6d 73 67 5b 69  c=='\n' ){ msg[i
9e70: 5d 20 3d 20 27 20 27 3b 20 73 70 6f 74 20 3d 20  ] = ' '; spot = 
9e80: 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  i; break; }.    
9e90: 69 66 28 20 63 3d 3d 30 20 29 7b 20 73 70 6f 74  if( c==0 ){ spot
9ea0: 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20   = i; break; }. 
9eb0: 20 20 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26     if( c=='-' &&
9ec0: 20 69 3c 6d 61 78 2d 31 20 29 20 73 70 6f 74 20   i<max-1 ) spot 
9ed0: 3d 20 69 2b 31 3b 0a 20 20 20 20 69 66 28 20 63  = i+1;.    if( c
9ee0: 3d 3d 27 20 27 20 29 20 73 70 6f 74 20 3d 20 69  ==' ' ) spot = i
9ef0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
9f00: 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  pot;.}../*.** Th
9f10: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
9f20: 69 73 20 73 70 6c 69 74 20 61 63 72 6f 73 73 20  is split across 
9f30: 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 65 73 20 69  multiple lines i
9f40: 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  f necessary.  Th
9f50: 65 0a 2a 2a 20 73 70 6c 69 74 73 20 6f 63 63 75  e.** splits occu
9f60: 72 20 61 74 20 61 20 73 70 61 63 65 2c 20 69 66  r at a space, if
9f70: 20 74 68 65 72 65 20 69 73 20 61 20 73 70 61 63   there is a spac
9f80: 65 20 61 76 61 69 6c 61 62 6c 65 20 6e 65 61 72  e available near
9f90: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 74   the end.** of t
9fa0: 68 65 20 6c 69 6e 65 2e 0a 2a 2f 0a 23 64 65 66  he line..*/.#def
9fb0: 69 6e 65 20 45 52 52 4d 53 47 53 49 5a 45 20 20  ine ERRMSGSIZE  
9fc0: 31 30 30 30 30 20 2f 2a 20 48 6f 70 65 20 74 68  10000 /* Hope th
9fd0: 69 73 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  is is big enough
9fe0: 2e 20 20 4e 6f 20 77 61 79 20 74 6f 20 65 72 72  .  No way to err
9ff0: 6f 72 20 63 68 65 63 6b 20 2a 2f 0a 23 64 65 66  or check */.#def
a000: 69 6e 65 20 4c 49 4e 45 57 49 44 54 48 20 20 20  ine LINEWIDTH   
a010: 20 20 20 37 39 20 2f 2a 20 4d 61 78 20 77 69 64     79 /* Max wid
a020: 74 68 20 6f 66 20 61 6e 79 20 6f 75 74 70 75 74  th of any output
a030: 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65   line */.#define
a040: 20 50 52 45 46 49 58 4c 49 4d 49 54 20 20 20 20   PREFIXLIMIT    
a050: 33 30 20 2f 2a 20 4d 61 78 20 77 69 64 74 68 20  30 /* Max width 
a060: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 6f 6e  of the prefix on
a070: 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 76 6f   each line */.vo
a080: 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73  id ErrorMsg(cons
a090: 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65  t char *filename
a0a0: 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f  , int lineno, co
a0b0: 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61 74  nst char *format
a0c0: 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 65  , ...){.  char e
a0d0: 72 72 6d 73 67 5b 45 52 52 4d 53 47 53 49 5a 45  rrmsg[ERRMSGSIZE
a0e0: 5d 3b 0a 20 20 63 68 61 72 20 70 72 65 66 69 78  ];.  char prefix
a0f0: 5b 50 52 45 46 49 58 4c 49 4d 49 54 2b 31 30 5d  [PREFIXLIMIT+10]
a100: 3b 0a 20 20 69 6e 74 20 65 72 72 6d 73 67 73 69  ;.  int errmsgsi
a110: 7a 65 3b 0a 20 20 69 6e 74 20 70 72 65 66 69 78  ze;.  int prefix
a120: 73 69 7a 65 3b 0a 20 20 69 6e 74 20 61 76 61 69  size;.  int avai
a130: 6c 61 62 6c 65 77 69 64 74 68 3b 0a 20 20 76 61  lablewidth;.  va
a140: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
a150: 65 6e 64 2c 20 72 65 73 74 61 72 74 2c 20 62 61  end, restart, ba
a160: 73 65 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28  se;..  va_start(
a170: 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20 2f  ap, format);.  /
a180: 2a 20 50 72 65 70 61 72 65 20 61 20 70 72 65 66  * Prepare a pref
a190: 69 78 20 74 6f 20 62 65 20 70 72 65 70 65 6e 64  ix to be prepend
a1a0: 65 64 20 74 6f 20 65 76 65 72 79 20 6f 75 74 70  ed to every outp
a1b0: 75 74 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28  ut line */.  if(
a1c0: 20 6c 69 6e 65 6e 6f 3e 30 20 29 7b 0a 20 20 20   lineno>0 ){.   
a1d0: 20 73 70 72 69 6e 74 66 28 70 72 65 66 69 78 2c   sprintf(prefix,
a1e0: 22 25 2e 2a 73 3a 25 64 3a 20 22 2c 50 52 45 46  "%.*s:%d: ",PREF
a1f0: 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69 6c 65 6e  IXLIMIT-10,filen
a200: 61 6d 65 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d  ame,lineno);.  }
a210: 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74  else{.    sprint
a220: 66 28 70 72 65 66 69 78 2c 22 25 2e 2a 73 3a 20  f(prefix,"%.*s: 
a230: 22 2c 50 52 45 46 49 58 4c 49 4d 49 54 2d 31 30  ",PREFIXLIMIT-10
a240: 2c 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  ,filename);.  }.
a250: 20 20 70 72 65 66 69 78 73 69 7a 65 20 3d 20 73    prefixsize = s
a260: 74 72 6c 65 6e 28 70 72 65 66 69 78 29 3b 0a 20  trlen(prefix);. 
a270: 20 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68 20   availablewidth 
a280: 3d 20 4c 49 4e 45 57 49 44 54 48 20 2d 20 70 72  = LINEWIDTH - pr
a290: 65 66 69 78 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  efixsize;..  /* 
a2a0: 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 72 72  Generate the err
a2b0: 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20  or message */.  
a2c0: 76 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c  vsprintf(errmsg,
a2d0: 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76 61  format,ap);.  va
a2e0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 65 72 72 6d  _end(ap);.  errm
a2f0: 73 67 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e 28  sgsize = strlen(
a300: 65 72 72 6d 73 67 29 3b 0a 20 20 2f 2a 20 52 65  errmsg);.  /* Re
a310: 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67 20 27 5c  move trailing '\
a320: 6e 27 73 20 66 72 6f 6d 20 74 68 65 20 65 72 72  n's from the err
a330: 6f 72 20 6d 65 73 73 61 67 65 2e 20 2a 2f 0a 20  or message. */. 
a340: 20 77 68 69 6c 65 28 20 65 72 72 6d 73 67 73 69   while( errmsgsi
a350: 7a 65 3e 30 20 26 26 20 65 72 72 6d 73 67 5b 65  ze>0 && errmsg[e
a360: 72 72 6d 73 67 73 69 7a 65 2d 31 5d 3d 3d 27 5c  rrmsgsize-1]=='\
a370: 6e 27 20 29 7b 0a 20 20 20 20 20 65 72 72 6d 73  n' ){.     errms
a380: 67 5b 2d 2d 65 72 72 6d 73 67 73 69 7a 65 5d 20  g[--errmsgsize] 
a390: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  = 0;.  }..  /* P
a3a0: 72 69 6e 74 20 74 68 65 20 65 72 72 6f 72 20 6d  rint the error m
a3b0: 65 73 73 61 67 65 20 2a 2f 0a 20 20 62 61 73 65  essage */.  base
a3c0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 65   = 0;.  while( e
a3d0: 72 72 6d 73 67 5b 62 61 73 65 5d 21 3d 30 20 29  rrmsg[base]!=0 )
a3e0: 7b 0a 20 20 20 20 65 6e 64 20 3d 20 72 65 73 74  {.    end = rest
a3f0: 61 72 74 20 3d 20 66 69 6e 64 62 72 65 61 6b 28  art = findbreak(
a400: 26 65 72 72 6d 73 67 5b 62 61 73 65 5d 2c 30 2c  &errmsg[base],0,
a410: 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68 29 3b  availablewidth);
a420: 0a 20 20 20 20 72 65 73 74 61 72 74 20 2b 3d 20  .    restart += 
a430: 62 61 73 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  base;.    while(
a440: 20 65 72 72 6d 73 67 5b 72 65 73 74 61 72 74 5d   errmsg[restart]
a450: 3d 3d 27 20 27 20 29 20 72 65 73 74 61 72 74 2b  ==' ' ) restart+
a460: 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  +;.    fprintf(s
a470: 74 64 6f 75 74 2c 22 25 73 25 2e 2a 73 5c 6e 22  tdout,"%s%.*s\n"
a480: 2c 70 72 65 66 69 78 2c 65 6e 64 2c 26 65 72 72  ,prefix,end,&err
a490: 6d 73 67 5b 62 61 73 65 5d 29 3b 0a 20 20 20 20  msg[base]);.    
a4a0: 62 61 73 65 20 3d 20 72 65 73 74 61 72 74 3b 0a  base = restart;.
a4b0: 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
a4c0: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
a4d0: 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a   file "main.c" *
a4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a4f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a500: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20  ***/./*.** Main 
a510: 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72  program file for
a520: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
a530: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
a540: 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75  ./* Report an ou
a550: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64  t-of-memory cond
a560: 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e  ition and abort.
a570: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a    This function.
a580: 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c  ** is used mostl
a590: 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79  y by the "Memory
a5a0: 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20  Check" macro in 
a5b0: 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64  struct.h.*/.void
a5c0: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b   memory_error(){
a5d0: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
a5e0: 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
a5f0: 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e  .  Aborting...\n
a600: 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  ");.  exit(1);.}
a610: 0a 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70  .../* The main p
a620: 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74  rogram.  Parse t
a630: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
a640: 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a  and do it... */.
a650: 69 6e 74 20 6d 61 69 6e 28 61 72 67 63 2c 61 72  int main(argc,ar
a660: 67 76 29 0a 69 6e 74 20 61 72 67 63 3b 0a 63 68  gv).int argc;.ch
a670: 61 72 20 2a 2a 61 72 67 76 3b 0a 7b 0a 20 20 73  ar **argv;.{.  s
a680: 74 61 74 69 63 20 69 6e 74 20 76 65 72 73 69 6f  tatic int versio
a690: 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  n = 0;.  static 
a6a0: 69 6e 74 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a  int rpflag = 0;.
a6b0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 62 61 73    static int bas
a6c0: 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74  isflag = 0;.  st
a6d0: 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 72 65 73  atic int compres
a6e0: 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  s = 0;.  static 
a6f0: 69 6e 74 20 71 75 69 65 74 20 3d 20 30 3b 0a 20  int quiet = 0;. 
a700: 20 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74   static int stat
a710: 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 73 74  istics = 0;.  st
a720: 61 74 69 63 20 69 6e 74 20 6d 68 66 6c 61 67 20  atic int mhflag 
a730: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74  = 0;.  static st
a740: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f  ruct s_options o
a750: 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20  ptions[] = {.   
a760: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c   {OPT_FLAG, "b",
a770: 20 28 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c   (char*)&basisfl
a780: 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20  ag, "Print only 
a790: 74 68 65 20 62 61 73 69 73 20 69 6e 20 72 65 70  the basis in rep
a7a0: 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ort."},.    {OPT
a7b0: 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61  _FLAG, "c", (cha
a7c0: 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44  r*)&compress, "D
a7d0: 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68  on't compress th
a7e0: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22  e action table."
a7f0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
a800: 2c 20 22 67 22 2c 20 28 63 68 61 72 2a 29 26 72  , "g", (char*)&r
a810: 70 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 67 72  pflag, "Print gr
a820: 61 6d 6d 61 72 20 77 69 74 68 6f 75 74 20 61 63  ammar without ac
a830: 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f  tions."},.    {O
a840: 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63  PT_FLAG, "m", (c
a850: 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f  har*)&mhflag, "O
a860: 75 74 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64  utput a makehead
a870: 65 72 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  ers compatible f
a880: 69 6c 65 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ile"},.    {OPT_
a890: 46 4c 41 47 2c 20 22 71 22 2c 20 28 63 68 61 72  FLAG, "q", (char
a8a0: 2a 29 26 71 75 69 65 74 2c 20 22 28 51 75 69 65  *)&quiet, "(Quie
a8b0: 74 29 20 44 6f 6e 27 74 20 70 72 69 6e 74 20 74  t) Don't print t
a8c0: 68 65 20 72 65 70 6f 72 74 20 66 69 6c 65 2e 22  he report file."
a8d0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
a8e0: 2c 20 22 73 22 2c 20 28 63 68 61 72 2a 29 26 73  , "s", (char*)&s
a8f0: 74 61 74 69 73 74 69 63 73 2c 20 22 50 72 69 6e  tatistics, "Prin
a900: 74 20 70 61 72 73 65 72 20 73 74 61 74 73 20 74  t parser stats t
a910: 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  o standard outpu
a920: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
a930: 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a  LAG, "x", (char*
a940: 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e  )&version, "Prin
a950: 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  t the version nu
a960: 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  mber."},.    {OP
a970: 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a 20 20  T_FLAG,0,0,0}.  
a980: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
a990: 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a  ruct lemon lem;.
a9a0: 0a 20 20 4f 70 74 49 6e 69 74 28 61 72 67 76 2c  .  OptInit(argv,
a9b0: 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72 72 29 3b  options,stderr);
a9c0: 0a 20 20 69 66 28 20 76 65 72 73 69 6f 6e 20 29  .  if( version )
a9d0: 7b 0a 20 20 20 20 20 70 72 69 6e 74 66 28 22 4c  {.     printf("L
a9e0: 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30  emon version 1.0
a9f0: 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78 69 74 28  \n");.     exit(
aa00: 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 4f  0); .  }.  if( O
aa10: 70 74 4e 41 72 67 73 28 29 21 3d 31 20 29 7b 0a  ptNArgs()!=1 ){.
aa20: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
aa30: 72 72 2c 22 45 78 61 63 74 6c 79 20 6f 6e 65 20  rr,"Exactly one 
aa40: 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  filename argumen
aa50: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 5c 6e  t is required.\n
aa60: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
aa70: 0a 20 20 7d 0a 20 20 6c 65 6d 2e 65 72 72 6f 72  .  }.  lem.error
aa80: 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  cnt = 0;..  /* I
aa90: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61  nitialize the ma
aaa0: 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61  chine */.  Strsa
aab0: 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d  fe_init();.  Sym
aac0: 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74  bol_init();.  St
aad0: 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65  ate_init();.  le
aae0: 6d 2e 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30  m.argv0 = argv[0
aaf0: 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d  ];.  lem.filenam
ab00: 65 20 3d 20 4f 70 74 41 72 67 28 30 29 3b 0a 20  e = OptArg(0);. 
ab10: 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d   lem.basisflag =
ab20: 20 62 61 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65   basisflag;.  le
ab30: 6d 2e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d  m.has_fallback =
ab40: 20 30 3b 0a 20 20 6c 65 6d 2e 6e 63 6f 6e 66 6c   0;.  lem.nconfl
ab50: 69 63 74 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 6e  ict = 0;.  lem.n
ab60: 61 6d 65 20 3d 20 6c 65 6d 2e 69 6e 63 6c 75 64  ame = lem.includ
ab70: 65 20 3d 20 6c 65 6d 2e 61 72 67 20 3d 20 6c 65  e = lem.arg = le
ab80: 6d 2e 74 6f 6b 65 6e 74 79 70 65 20 3d 20 6c 65  m.tokentype = le
ab90: 6d 2e 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  m.start = 0;.  l
aba0: 65 6d 2e 76 61 72 74 79 70 65 20 3d 20 30 3b 0a  em.vartype = 0;.
abb0: 20 20 6c 65 6d 2e 73 74 61 63 6b 73 69 7a 65 20    lem.stacksize 
abc0: 3d 20 30 3b 0a 20 20 6c 65 6d 2e 65 72 72 6f 72  = 0;.  lem.error
abd0: 20 3d 20 6c 65 6d 2e 6f 76 65 72 66 6c 6f 77 20   = lem.overflow 
abe0: 3d 20 6c 65 6d 2e 66 61 69 6c 75 72 65 20 3d 20  = lem.failure = 
abf0: 6c 65 6d 2e 61 63 63 65 70 74 20 3d 20 6c 65 6d  lem.accept = lem
ac00: 2e 74 6f 6b 65 6e 64 65 73 74 20 3d 0a 20 20 20  .tokendest =.   
ac10: 20 20 6c 65 6d 2e 74 6f 6b 65 6e 70 72 65 66 69    lem.tokenprefi
ac20: 78 20 3d 20 6c 65 6d 2e 6f 75 74 6e 61 6d 65 20  x = lem.outname 
ac30: 3d 20 6c 65 6d 2e 65 78 74 72 61 63 6f 64 65 20  = lem.extracode 
ac40: 3d 20 30 3b 0a 20 20 6c 65 6d 2e 76 61 72 64 65  = 0;.  lem.varde
ac50: 73 74 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 74 61  st = 0;.  lem.ta
ac60: 62 6c 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 53  blesize = 0;.  S
ac70: 79 6d 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a  ymbol_new("$");.
ac80: 20 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53    lem.errsym = S
ac90: 79 6d 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72  ymbol_new("error
aca0: 22 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  ");..  /* Parse 
acb0: 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
acc0: 2f 0a 20 20 50 61 72 73 65 28 26 6c 65 6d 29 3b  /.  Parse(&lem);
acd0: 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72 72 6f 72  .  if( lem.error
ace0: 63 6e 74 20 29 20 65 78 69 74 28 6c 65 6d 2e 65  cnt ) exit(lem.e
acf0: 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69 66 28 20  rrorcnt);.  if( 
ad00: 6c 65 6d 2e 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  lem.rule==0 ){. 
ad10: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
ad20: 72 2c 22 45 6d 70 74 79 20 67 72 61 6d 6d 61 72  r,"Empty grammar
ad30: 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
ad40: 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f  1);.  }..  /* Co
ad50: 75 6e 74 20 61 6e 64 20 69 6e 64 65 78 20 74 68  unt and index th
ad60: 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65  e symbols of the
ad70: 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 6c 65   grammar */.  le
ad80: 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d 62  m.nsymbol = Symb
ad90: 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 53 79  ol_count();.  Sy
ada0: 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75  mbol_new("{defau
adb0: 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e 73 79 6d  lt}");.  lem.sym
adc0: 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c 5f 61 72  bols = Symbol_ar
add0: 72 61 79 6f 66 28 29 3b 0a 20 20 71 73 6f 72 74  rayof();.  qsort
ade0: 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d  (lem.symbols,lem
adf0: 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65 6f  .nsymbol+1,sizeo
ae00: 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a  f(struct symbol*
ae10: 29 2c 0a 20 20 20 20 20 20 20 20 28 69 6e 74 28  ),.        (int(
ae20: 2a 29 28 29 29 53 79 6d 62 6f 6c 63 6d 70 70 29  *)())Symbolcmpp)
ae30: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
ae40: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  lem.nsymbol; i++
ae50: 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d  ) lem.symbols[i]
ae60: 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 66  ->index = i;.  f
ae70: 6f 72 28 69 3d 31 3b 20 69 73 75 70 70 65 72 28  or(i=1; isupper(
ae80: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  lem.symbols[i]->
ae90: 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a  name[0]); i++);.
aea0: 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20    lem.nterminal 
aeb0: 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  = i;..  /* Gener
aec0: 61 74 65 20 61 20 72 65 70 72 69 6e 74 20 6f 66  ate a reprint of
aed0: 20 74 68 65 20 67 72 61 6d 6d 61 72 2c 20 69 66   the grammar, if
aee0: 20 72 65 71 75 65 73 74 65 64 20 6f 6e 20 74 68   requested on th
aef0: 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a  e command line *
af00: 2f 0a 20 20 69 66 28 20 72 70 66 6c 61 67 20 29  /.  if( rpflag )
af10: 7b 0a 20 20 20 20 52 65 70 72 69 6e 74 28 26 6c  {.    Reprint(&l
af20: 65 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  em);.  }else{.  
af30: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
af40: 74 68 65 20 73 69 7a 65 20 66 6f 72 20 61 6c 6c  the size for all
af50: 20 66 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72 73   follow and firs
af60: 74 20 73 65 74 73 20 2a 2f 0a 20 20 20 20 53 65  t sets */.    Se
af70: 74 53 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d 69  tSize(lem.ntermi
af80: 6e 61 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  nal);..    /* Fi
af90: 6e 64 20 74 68 65 20 70 72 65 63 65 64 65 6e 63  nd the precedenc
afa0: 65 20 66 6f 72 20 65 76 65 72 79 20 70 72 6f 64  e for every prod
afb0: 75 63 74 69 6f 6e 20 72 75 6c 65 20 28 74 68 61  uction rule (tha
afc0: 74 20 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20 20  t has one) */.  
afd0: 20 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64    FindRulePreced
afe0: 65 6e 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  ences(&lem);..  
aff0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
b000: 20 6c 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d 69   lambda-nontermi
b010: 6e 61 6c 73 20 61 6e 64 20 74 68 65 20 66 69 72  nals and the fir
b020: 73 74 2d 73 65 74 73 20 66 6f 72 20 65 76 65 72  st-sets for ever
b030: 79 0a 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d  y.    ** nonterm
b040: 69 6e 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e 64  inal */.    Find
b050: 46 69 72 73 74 53 65 74 73 28 26 6c 65 6d 29 3b  FirstSets(&lem);
b060: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
b070: 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65   all LR(0) state
b080: 73 2e 20 20 41 6c 73 6f 20 72 65 63 6f 72 64 20  s.  Also record 
b090: 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61  follow-set propa
b0a0: 67 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69  gation.    ** li
b0b0: 6e 6b 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  nks so that the 
b0c0: 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20 62  follow-set can b
b0d0: 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72  e computed later
b0e0: 20 2a 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74 61   */.    lem.nsta
b0f0: 74 65 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e 64  te = 0;.    Find
b100: 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20 20  States(&lem);.  
b110: 20 20 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20 53    lem.sorted = S
b120: 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 3b 0a  tate_arrayof();.
b130: 0a 20 20 20 20 2f 2a 20 54 69 65 20 75 70 20 6c  .    /* Tie up l
b140: 6f 6f 73 65 20 65 6e 64 73 20 6f 6e 20 74 68 65  oose ends on the
b150: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
b160: 6b 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c 69  ks */.    FindLi
b170: 6e 6b 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  nks(&lem);..    
b180: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66  /* Compute the f
b190: 6f 6c 6c 6f 77 20 73 65 74 20 6f 66 20 65 76 65  ollow set of eve
b1a0: 72 79 20 72 65 64 75 63 69 62 6c 65 20 63 6f 6e  ry reducible con
b1b0: 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  figuration */.  
b1c0: 20 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73    FindFollowSets
b1d0: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
b1e0: 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69  Compute the acti
b1f0: 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20  on tables */.   
b200: 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c 65   FindActions(&le
b210: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
b220: 72 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20  ress the action 
b230: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 66  tables */.    if
b240: 28 20 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29 20  ( compress==0 ) 
b250: 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 26  CompressTables(&
b260: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  lem);..    /* Ge
b270: 6e 65 72 61 74 65 20 61 20 72 65 70 6f 72 74 20  nerate a report 
b280: 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 67 65  of the parser ge
b290: 6e 65 72 61 74 65 64 2e 20 20 28 74 68 65 20 22  nerated.  (the "
b2a0: 79 2e 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20  y.output" file) 
b2b0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 71 75 69 65  */.    if( !quie
b2c0: 74 20 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74  t ) ReportOutput
b2d0: 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20  (&lem);..    /* 
b2e0: 47 65 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75  Generate the sou
b2f0: 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  rce code for the
b300: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52   parser */.    R
b310: 65 70 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c  eportTable(&lem,
b320: 20 6d 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f   mhflag);..    /
b330: 2a 20 50 72 6f 64 75 63 65 20 61 20 68 65 61 64  * Produce a head
b340: 65 72 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20  er file for use 
b350: 62 79 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20  by the scanner. 
b360: 20 28 54 68 69 73 20 73 74 65 70 20 69 73 0a 20   (This step is. 
b370: 20 20 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66     ** omitted if
b380: 20 74 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e   the "-m" option
b390: 20 69 73 20 75 73 65 64 20 62 65 63 61 75 73 65   is used because
b3a0: 20 6d 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c   makeheaders wil
b3b0: 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74  l.    ** generat
b3c0: 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75  e the file for u
b3d0: 73 2e 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  s.) */.    if( !
b3e0: 6d 68 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48  mhflag ) ReportH
b3f0: 65 61 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d  eader(&lem);.  }
b400: 0a 20 20 69 66 28 20 73 74 61 74 69 73 74 69 63  .  if( statistic
b410: 73 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  s ){.    printf(
b420: 22 50 61 72 73 65 72 20 73 74 61 74 69 73 74 69  "Parser statisti
b430: 63 73 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c 73  cs: %d terminals
b440: 2c 20 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  , %d nonterminal
b450: 73 2c 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c 0a  s, %d rules\n",.
b460: 20 20 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d 69        lem.ntermi
b470: 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c  nal, lem.nsymbol
b480: 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c   - lem.nterminal
b490: 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20  , lem.nrule);.  
b4a0: 20 20 70 72 69 6e 74 66 28 22 20 20 20 20 20 20    printf("      
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
b4c0: 73 74 61 74 65 73 2c 20 25 64 20 70 61 72 73 65  states, %d parse
b4d0: 72 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2c  r table entries,
b4e0: 20 25 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e 22   %d conflicts\n"
b4f0: 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74 61  ,.      lem.nsta
b500: 74 65 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a  te, lem.tablesiz
b510: 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74  e, lem.nconflict
b520: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d  );.  }.  if( lem
b530: 2e 6e 63 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20  .nconflict ){.  
b540: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b550: 2c 22 25 64 20 70 61 72 73 69 6e 67 20 63 6f 6e  ,"%d parsing con
b560: 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e  flicts.\n",lem.n
b570: 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 20  conflict);.  }. 
b580: 20 65 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63   exit(lem.errorc
b590: 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69  nt + lem.nconfli
b5a0: 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ct);.}./********
b5b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
b5c0: 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 73 6f 72  m the file "msor
b5d0: 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t.c" ***********
b5e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b5f0: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65  ****/./*.** A ge
b600: 6e 65 72 69 63 20 6d 65 72 67 65 2d 73 6f 72 74  neric merge-sort
b610: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
b620: 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74 20 22 70  USAGE:.** Let "p
b630: 74 72 22 20 62 65 20 61 20 70 6f 69 6e 74 65 72  tr" be a pointer
b640: 20 74 6f 20 73 6f 6d 65 20 73 74 72 75 63 74 75   to some structu
b650: 72 65 20 77 68 69 63 68 20 69 73 20 61 74 20 74  re which is at t
b660: 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a 20 61 20  he head of.** a 
b670: 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20  null-terminated 
b680: 6c 69 73 74 2e 20 20 54 68 65 6e 20 74 6f 20 73  list.  Then to s
b690: 6f 72 74 20 74 68 65 20 6c 69 73 74 20 63 61 6c  ort the list cal
b6a0: 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 74 72  l:.**.**     ptr
b6b0: 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c 26 28 70   = msort(ptr,&(p
b6c0: 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70 66 6e 63  tr->next),cmpfnc
b6d0: 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  );.**.** In the 
b6e0: 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e 63 22 20  above, "cmpfnc" 
b6f0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
b700: 61 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 63 68  a function which
b710: 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20 74 77 6f   compares.** two
b720: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
b730: 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
b740: 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67  returns an integ
b750: 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20 73 74 72  er, as in.** str
b760: 63 6d 70 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  cmp.  The second
b770: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
b780: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 6f  ointer to the po
b790: 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20  inter to the.** 
b7a0: 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f  second element o
b7b0: 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  f the linked lis
b7c0: 74 2e 20 20 54 68 69 73 20 61 64 64 72 65 73 73  t.  This address
b7d0: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   is used to comp
b7e0: 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65  ute.** the offse
b7f0: 74 20 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20  t to the "next" 
b800: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
b810: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
b820: 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a 20 74 68   offset to.** th
b830: 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 20 6d  e "next" field m
b840: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20  ust be constant 
b850: 66 6f 72 20 61 6c 6c 20 73 74 72 75 63 74 75 72  for all structur
b860: 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  es in the list..
b870: 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69  **.** The functi
b880: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77  on returns a new
b890: 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 69   pointer which i
b8a0: 73 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  s the head of th
b8b0: 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74 65 72 20  e list.** after 
b8c0: 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  sorting..**.** A
b8d0: 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72  LGORITHM:.** Mer
b8e0: 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a  ge-sort..*/../*.
b8f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
b900: 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ter to the next 
b910: 73 74 72 75 63 74 75 72 65 20 69 6e 20 74 68 65  structure in the
b920: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f   linked list..*/
b930: 0a 23 64 65 66 69 6e 65 20 4e 45 58 54 28 41 29  .#define NEXT(A)
b940: 20 28 2a 28 63 68 61 72 2a 2a 29 28 28 28 75 6e   (*(char**)(((un
b950: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 41 29 2b 6f  signed long)A)+o
b960: 66 66 73 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49  ffset))../*.** I
b970: 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20  nputs:.**   a:  
b980: 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e       A sorted, n
b990: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c  ull-terminated l
b9a0: 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61  inked list.  (Ma
b9b0: 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20  y be null)..**  
b9c0: 20 62 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74   b:       A sort
b9d0: 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  ed, null-termina
b9e0: 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  ted linked list.
b9f0: 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e    (May be null).
ba00: 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 41  .**   cmp:     A
ba10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
ba20: 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
ba30: 69 6f 6e 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74  ion..**   offset
ba40: 3a 20 20 4f 66 66 73 65 74 20 69 6e 20 74 68 65  :  Offset in the
ba50: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 68   structure to th
ba60: 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a  e "next" field..
ba70: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c  **.** Return Val
ba80: 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74  ue:.**   A point
ba90: 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
baa0: 66 20 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20  f a sorted list 
bab0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
bac0: 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20  lements.**   of 
bad0: 62 6f 74 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a  both a and b..**
bae0: 0a 2a 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  .** Side effects
baf0: 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74  :.**   The "next
bb00: 22 20 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65  " pointers for e
bb10: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c  lements in the l
bb20: 69 73 74 73 20 61 20 61 6e 64 20 62 20 61 72 65  ists a and b are
bb30: 0a 2a 2a 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a  .**   changed..*
bb40: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d  /.static char *m
bb50: 65 72 67 65 28 61 2c 62 2c 63 6d 70 2c 6f 66 66  erge(a,b,cmp,off
bb60: 73 65 74 29 0a 63 68 61 72 20 2a 61 3b 0a 63 68  set).char *a;.ch
bb70: 61 72 20 2a 62 3b 0a 69 6e 74 20 28 2a 63 6d 70  ar *b;.int (*cmp
bb80: 29 28 29 3b 0a 69 6e 74 20 6f 66 66 73 65 74 3b  )();.int offset;
bb90: 0a 7b 0a 20 20 63 68 61 72 20 2a 70 74 72 2c 20  .{.  char *ptr, 
bba0: 2a 68 65 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d  *head;..  if( a=
bbb0: 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d  =0 ){.    head =
bbc0: 20 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   b;.  }else if( 
bbd0: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64  b==0 ){.    head
bbe0: 20 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = a;.  }else{. 
bbf0: 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c     if( (*cmp)(a,
bc00: 62 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 74  b)<0 ){.      pt
bc10: 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d  r = a;.      a =
bc20: 20 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65   NEXT(a);.    }e
bc30: 6c 73 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d  lse{.      ptr =
bc40: 20 62 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45   b;.      b = NE
bc50: 58 54 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  XT(b);.    }.   
bc60: 20 68 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20   head = ptr;.   
bc70: 20 77 68 69 6c 65 28 20 61 20 26 26 20 62 20 29   while( a && b )
bc80: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d  {.      if( (*cm
bc90: 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20  p)(a,b)<0 ){.   
bca0: 20 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d       NEXT(ptr) =
bcb0: 20 61 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20   a;.        ptr 
bcc0: 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d  = a;.        a =
bcd0: 20 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20   NEXT(a);.      
bce0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e  }else{.        N
bcf0: 45 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20  EXT(ptr) = b;.  
bd00: 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20        ptr = b;. 
bd10: 20 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28         b = NEXT(
bd20: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
bd30: 7d 0a 20 20 20 20 69 66 28 20 61 20 29 20 4e 45  }.    if( a ) NE
bd40: 58 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20  XT(ptr) = a;.   
bd50: 20 65 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74   else    NEXT(pt
bd60: 72 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65  r) = b;.  }.  re
bd70: 74 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a  turn head;.}../*
bd80: 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20  .** Inputs:.**  
bd90: 20 6c 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e   list:      Poin
bda0: 74 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d  ter to a singly-
bdb0: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73  linked list of s
bdc0: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20  tructures..**   
bdd0: 6e 65 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74  next:      Point
bde0: 65 72 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f  er to pointer to
bdf0: 20 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d   the second elem
be00: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e  ent of the list.
be10: 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20  .**   cmp:      
be20: 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75   A comparison fu
be30: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65  nction..**.** Re
be40: 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20  turn Value:.**  
be50: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   A pointer to th
be60: 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74  e head of a sort
be70: 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69  ed list containi
be80: 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a  ng the elements.
be90: 2a 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69  **   orginally i
bea0: 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69  n list..**.** Si
beb0: 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20  de effects:.**  
bec0: 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e   The "next" poin
bed0: 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74  ters for element
bee0: 73 20 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68  s in list are ch
bef0: 61 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e  anged..*/.#defin
bf00: 65 20 4c 49 53 54 53 49 5a 45 20 33 30 0a 63 68  e LISTSIZE 30.ch
bf10: 61 72 20 2a 6d 73 6f 72 74 28 6c 69 73 74 2c 6e  ar *msort(list,n
bf20: 65 78 74 2c 63 6d 70 29 0a 63 68 61 72 20 2a 6c  ext,cmp).char *l
bf30: 69 73 74 3b 0a 63 68 61 72 20 2a 2a 6e 65 78 74  ist;.char **next
bf40: 3b 0a 69 6e 74 20 28 2a 63 6d 70 29 28 29 3b 0a  ;.int (*cmp)();.
bf50: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
bf60: 67 20 6f 66 66 73 65 74 3b 0a 20 20 63 68 61 72  g offset;.  char
bf70: 20 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a 73 65   *ep;.  char *se
bf80: 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69  t[LISTSIZE];.  i
bf90: 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d  nt i;.  offset =
bfa0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
bfb0: 6e 65 78 74 20 2d 20 28 75 6e 73 69 67 6e 65 64  next - (unsigned
bfc0: 20 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20 20 66 6f   long)list;.  fo
bfd0: 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a  r(i=0; i<LISTSIZ
bfe0: 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d  E; i++) set[i] =
bff0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69 73   0;.  while( lis
c000: 74 20 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69  t ){.    ep = li
c010: 73 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e  st;.    list = N
c020: 45 58 54 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e  EXT(list);.    N
c030: 45 58 54 28 65 70 29 20 3d 20 30 3b 0a 20 20 20  EXT(ep) = 0;.   
c040: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
c050: 53 49 5a 45 2d 31 20 26 26 20 73 65 74 5b 69 5d  SIZE-1 && set[i]
c060: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
c070: 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73   ep = merge(ep,s
c080: 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74  et[i],cmp,offset
c090: 29 3b 0a 20 20 20 20 20 20 73 65 74 5b 69 5d 20  );.      set[i] 
c0a0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  = 0;.    }.    s
c0b0: 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a  et[i] = ep;.  }.
c0c0: 20 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28    ep = 0;.  for(
c0d0: 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b  i=0; i<LISTSIZE;
c0e0: 20 69 2b 2b 29 20 69 66 28 20 73 65 74 5b 69 5d   i++) if( set[i]
c0f0: 20 29 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70   ) ep = merge(ep
c100: 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73  ,set[i],cmp,offs
c110: 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 70  et);.  return ep
c120: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
c130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
c140: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74  om the file "opt
c150: 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.c" *********
c160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c170: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
c180: 2a 61 72 67 76 3b 0a 73 74 61 74 69 63 20 73 74  *argv;.static st
c190: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a  ruct s_options *
c1a0: 6f 70 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 20  op;.static FILE 
c1b0: 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65  *errstream;..#de
c1c0: 66 69 6e 65 20 49 53 4f 50 54 28 58 29 20 28 28  fine ISOPT(X) ((
c1d0: 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b  X)[0]=='-'||(X)[
c1e0: 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28  0]=='+'||strchr(
c1f0: 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a  (X),'=')!=0)../*
c200: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f  .** Print the co
c210: 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74 68 20  mmand line with 
c220: 61 20 63 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e  a carrot pointin
c230: 67 20 74 6f 20 74 68 65 20 6b 2d 74 68 20 63 68  g to the k-th ch
c240: 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68  aracter.** of th
c250: 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f  e n-th field..*/
c260: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 72 72  .static void err
c270: 6c 69 6e 65 28 6e 2c 6b 2c 65 72 72 29 0a 69 6e  line(n,k,err).in
c280: 74 20 6e 3b 0a 69 6e 74 20 6b 3b 0a 46 49 4c 45  t n;.int k;.FILE
c290: 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 73   *err;.{.  int s
c2a0: 70 63 6e 74 2c 20 69 3b 0a 20 20 73 70 63 6e 74  pcnt, i;.  spcnt
c2b0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76   = 0;.  if( argv
c2c0: 5b 30 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72  [0] ) fprintf(er
c2d0: 72 2c 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b  r,"%s",argv[0]);
c2e0: 0a 20 20 73 70 63 6e 74 20 3d 20 73 74 72 6c 65  .  spcnt = strle
c2f0: 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a  n(argv[0]) + 1;.
c300: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26    for(i=1; i<n &
c310: 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b  & argv[i]; i++){
c320: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
c330: 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b  ," %s",argv[i]);
c340: 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 73 74  .    spcnt += st
c350: 72 6c 65 6e 28 61 72 67 76 5b 69 5d 2b 31 29 3b  rlen(argv[i]+1);
c360: 0a 20 20 7d 0a 20 20 73 70 63 6e 74 20 2b 3d 20  .  }.  spcnt += 
c370: 6b 3b 0a 20 20 66 6f 72 28 3b 20 61 72 67 76 5b  k;.  for(; argv[
c380: 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69 6e 74 66  i]; i++) fprintf
c390: 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b  (err," %s",argv[
c3a0: 69 5d 29 3b 0a 20 20 69 66 28 20 73 70 63 6e 74  i]);.  if( spcnt
c3b0: 3c 32 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  <20 ){.    fprin
c3c0: 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 5e 2d 2d  tf(err,"\n%*s^--
c3d0: 20 68 65 72 65 5c 6e 22 2c 73 70 63 6e 74 2c 22   here\n",spcnt,"
c3e0: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
c3f0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e   fprintf(err,"\n
c400: 25 2a 73 68 65 72 65 20 2d 2d 5e 5c 6e 22 2c 73  %*shere --^\n",s
c410: 70 63 6e 74 2d 37 2c 22 22 29 3b 0a 20 20 7d 0a  pcnt-7,"");.  }.
c420: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c430: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
c440: 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77 69 74 63 68   N-th non-switch
c450: 20 61 72 67 75 6d 65 6e 74 2e 20 20 52 65 74 75   argument.  Retu
c460: 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 4e 20 69 73  rn -1.** if N is
c470: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 0a 2a   out of range..*
c480: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 67  /.static int arg
c490: 69 6e 64 65 78 28 6e 29 0a 69 6e 74 20 6e 3b 0a  index(n).int n;.
c4a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
c4b0: 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20   dashdash = 0;. 
c4c0: 20 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20   if( argv!=0 && 
c4d0: 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20  *argv!=0 ){.    
c4e0: 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d  for(i=1; argv[i]
c4f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
c500: 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49  ( dashdash || !I
c510: 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 7b  SOPT(argv[i]) ){
c520: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  .        if( n==
c530: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
c540: 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
c550: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72   }.      if( str
c560: 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22  cmp(argv[i],"--"
c570: 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68 20  )==0 ) dashdash 
c580: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
c590: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73   return -1;.}..s
c5a0: 74 61 74 69 63 20 63 68 61 72 20 65 6d 73 67 5b  tatic char emsg[
c5b0: 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e  ] = "Command lin
c5c0: 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72 3a 20  e syntax error: 
c5d0: 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  ";../*.** Proces
c5e0: 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64  s a flag command
c5f0: 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a   line argument..
c600: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
c610: 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29  ndleflags(i,err)
c620: 0a 69 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72  .int i;.FILE *er
c630: 72 3b 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20  r;.{.  int v;.  
c640: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
c650: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
c660: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
c670: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
c680: 74 72 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31  trcmp(&argv[i][1
c690: 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d  ],op[j].label)==
c6a0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
c6b0: 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b 30 5d 3d   v = argv[i][0]=
c6c0: 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b 0a 20 20  ='-' ? 1 : 0;.  
c6d0: 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d  if( op[j].label=
c6e0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72  =0 ){.    if( er
c6f0: 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  r ){.      fprin
c700: 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69  tf(err,"%sundefi
c710: 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65  ned option.\n",e
c720: 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c  msg);.      errl
c730: 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20  ine(i,1,err);.  
c740: 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b    }.    errcnt++
c750: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
c760: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c  [j].type==OPT_FL
c770: 41 47 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74  AG ){.    *((int
c780: 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76  *)op[j].arg) = v
c790: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
c7a0: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46  [j].type==OPT_FF
c7b0: 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f  LAG ){.    (*(vo
c7c0: 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61  id(*)())(op[j].a
c7d0: 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rg))(v);.  }else
c7e0: 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b  {.    if( err ){
c7f0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65  .      fprintf(e
c800: 72 72 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72  rr,"%smissing ar
c810: 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68  gument on switch
c820: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
c830: 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72    errline(i,1,er
c840: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
c850: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  rcnt++;.  }.  re
c860: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a  turn errcnt;.}..
c870: 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20  /*.** Process a 
c880: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69  command line swi
c890: 74 63 68 20 77 68 69 63 68 20 68 61 73 20 61 6e  tch which has an
c8a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
c8b0: 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73  atic int handles
c8c0: 77 69 74 63 68 28 69 2c 65 72 72 29 0a 69 6e 74  witch(i,err).int
c8d0: 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b   i;.FILE *err;.{
c8e0: 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20  .  int lv = 0;. 
c8f0: 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30   double dv = 0.0
c900: 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30  ;.  char *sv = 0
c910: 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a  , *end;.  char *
c920: 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  cp;.  int j;.  i
c930: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
c940: 20 63 70 20 3d 20 73 74 72 63 68 72 28 61 72 67   cp = strchr(arg
c950: 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 2a 63 70  v[i],'=');.  *cp
c960: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   = 0;.  for(j=0;
c970: 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b   op[j].label; j+
c980: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
c990: 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d  mp(argv[i],op[j]
c9a0: 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65  .label)==0 ) bre
c9b0: 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20  ak;.  }.  *cp = 
c9c0: 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d  '=';.  if( op[j]
c9d0: 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20  .label==0 ){.   
c9e0: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
c9f0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
ca00: 73 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f  sundefined optio
ca10: 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  n.\n",emsg);.   
ca20: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65     errline(i,0,e
ca30: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  rr);.    }.    e
ca40: 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65  rrcnt++;.  }else
ca50: 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20  {.    cp++;.    
ca60: 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79  switch( op[j].ty
ca70: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
ca80: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
ca90: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
caa0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72  .        if( err
cab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
cac0: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 6f 70 74  rintf(err,"%sopt
cad0: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
cae0: 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73  argument.\n",ems
caf0: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 72  g);.          er
cb00: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a  rline(i,0,err);.
cb10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cb20: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
cb30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
cb40: 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20   case OPT_DBL:. 
cb50: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44       case OPT_FD
cb60: 42 4c 3a 0a 20 20 20 20 20 20 20 20 64 76 20 3d  BL:.        dv =
cb70: 20 73 74 72 74 6f 64 28 63 70 2c 26 65 6e 64 29   strtod(cp,&end)
cb80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65  ;.        if( *e
cb90: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
cba0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
cbb0: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
cbc0: 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68  rr,"%sillegal ch
cbd0: 61 72 61 63 74 65 72 20 69 6e 20 66 6c 6f 61 74  aracter in float
cbe0: 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65  ing-point argume
cbf0: 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20  nt.\n",emsg);.  
cc00: 20 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e            errlin
cc10: 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c  e(i,((unsigned l
cc20: 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e  ong)end)-(unsign
cc30: 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c  ed long)argv[i],
cc40: 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  err);.          
cc50: 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63  }.          errc
cc60: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nt++;.        }.
cc70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cc80: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e       case OPT_IN
cc90: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  T:.      case OP
cca0: 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  T_FINT:.        
ccb0: 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26  lv = strtol(cp,&
ccc0: 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  end,0);.        
ccd0: 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20  if( *end ){.    
cce0: 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b        if( err ){
ccf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
cd00: 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65  intf(err,"%sille
cd10: 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e  gal character in
cd20: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
cd30: 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  t.\n",emsg);.   
cd40: 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65           errline
cd50: 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  (i,((unsigned lo
cd60: 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65  ng)end)-(unsigne
cd70: 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65  d long)argv[i],e
cd80: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rr);.          }
cd90: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e  .          errcn
cda0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
cdb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
cdc0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
cdd0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
cde0: 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73  _FSTR:.        s
cdf0: 76 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20  v = cp;.        
ce00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ce10: 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74   switch( op[j].t
ce20: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
ce30: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
ce40: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
ce50: 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  :.        break;
ce60: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
ce70: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64  DBL:.        *(d
ce80: 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72  ouble*)(op[j].ar
ce90: 67 29 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20  g) = dv;.       
cea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ceb0: 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20  se OPT_FDBL:.   
cec0: 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28       (*(void(*)(
ced0: 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64  ))(op[j].arg))(d
cee0: 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  v);.        brea
cef0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
cf00: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a  T_INT:.        *
cf10: 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  (int*)(op[j].arg
cf20: 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20 20  ) = lv;.        
cf30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
cf40: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
cf50: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29      (*(void(*)()
cf60: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28 69  )(op[j].arg))((i
cf70: 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20 20 20 20  nt)lv);.        
cf80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
cf90: 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
cfa0: 20 20 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70 5b     *(char**)(op[
cfb0: 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20 20  j].arg) = sv;.  
cfc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cfd0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52     case OPT_FSTR
cfe0: 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69  :.        (*(voi
cff0: 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72  d(*)())(op[j].ar
d000: 67 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20  g))(sv);.       
d010: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d020: 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e  }.  return errcn
d030: 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69  t;.}..int OptIni
d040: 74 28 61 2c 6f 2c 65 72 72 29 0a 63 68 61 72 20  t(a,o,err).char 
d050: 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70  **a;.struct s_op
d060: 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c 45 20 2a  tions *o;.FILE *
d070: 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 65 72 72  err;.{.  int err
d080: 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67 76 20  cnt = 0;.  argv 
d090: 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20  = a;.  op = o;. 
d0a0: 20 65 72 72 73 74 72 65 61 6d 20 3d 20 65 72 72   errstream = err
d0b0: 3b 0a 20 20 69 66 28 20 61 72 67 76 20 26 26 20  ;.  if( argv && 
d0c0: 2a 61 72 67 76 20 26 26 20 6f 70 20 29 7b 0a 20  *argv && op ){. 
d0d0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
d0e0: 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20  r(i=1; argv[i]; 
d0f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
d100: 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20  argv[i][0]=='+' 
d110: 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27  || argv[i][0]=='
d120: 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  -' ){.        er
d130: 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c  rcnt += handlefl
d140: 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20  ags(i,err);.    
d150: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
d160: 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20  hr(argv[i],'=') 
d170: 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e  ){.        errcn
d180: 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74 63  t += handleswitc
d190: 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  h(i,err);.      
d1a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
d1b0: 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20  ( errcnt>0 ){.  
d1c0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 56    fprintf(err,"V
d1d0: 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  alid command lin
d1e0: 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22  e options for \"
d1f0: 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29  %s\" are:\n",*a)
d200: 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74 28 29  ;.    OptPrint()
d210: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
d220: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
d230: 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73 28 29  ..int OptNArgs()
d240: 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  {.  int cnt = 0;
d250: 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20  .  int dashdash 
d260: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
d270: 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 61  if( argv!=0 && a
d280: 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20  rgv[0]!=0 ){.   
d290: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
d2a0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
d2b0: 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21  f( dashdash || !
d2c0: 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29  ISOPT(argv[i]) )
d2d0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
d2e0: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
d2f0: 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68  ,"--")==0 ) dash
d300: 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  dash = 1;.    }.
d310: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74    }.  return cnt
d320: 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72  ;.}..char *OptAr
d330: 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20  g(n).int n;.{.  
d340: 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67  int i;.  i = arg
d350: 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65 74 75  index(n);.  retu
d360: 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69  rn i>=0 ? argv[i
d370: 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f  ] : 0;.}..void O
d380: 70 74 45 72 72 28 6e 29 0a 69 6e 74 20 6e 3b 0a  ptErr(n).int n;.
d390: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d  {.  int i;.  i =
d3a0: 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20   argindex(n);.  
d3b0: 69 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69  if( i>=0 ) errli
d3c0: 6e 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d  ne(i,0,errstream
d3d0: 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72  );.}..void OptPr
d3e0: 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  int(){.  int i;.
d3f0: 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a    int max, len;.
d400: 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72    max = 0;.  for
d410: 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65  (i=0; op[i].labe
d420: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e  l; i++){.    len
d430: 20 3d 20 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e   = strlen(op[i].
d440: 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20  label) + 1;.    
d450: 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79  switch( op[i].ty
d460: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
d470: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
d480: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
d490: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d4a0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49        case OPT_I
d4b0: 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  NT:.      case O
d4c0: 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20  PT_FINT:.       
d4d0: 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20   len += 9;      
d4e0: 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c   /* length of "<
d4f0: 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20  integer>" */.   
d500: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d510: 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a    case OPT_DBL:.
d520: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
d530: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e  DBL:.        len
d540: 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20   += 6;       /* 
d550: 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c  length of "<real
d560: 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  >" */.        br
d570: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d580: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63  OPT_STR:.      c
d590: 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20  ase OPT_FSTR:.  
d5a0: 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20        len += 8; 
d5b0: 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
d5c0: 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f  of "<string>" */
d5d0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
d5e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65      }.    if( le
d5f0: 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65  n>max ) max = le
d600: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
d610: 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69  ; op[i].label; i
d620: 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ++){.    switch(
d630: 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20   op[i].type ){. 
d640: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c       case OPT_FL
d650: 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  AG:.      case O
d660: 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20  PT_FFLAG:.      
d670: 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
d680: 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73  eam,"  -%-*s  %s
d690: 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61  \n",max,op[i].la
d6a0: 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  bel,op[i].messag
d6b0: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
d6c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d6d0: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  T_INT:.      cas
d6e0: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
d6f0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
d700: 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69 6e 74  tream,"  %s=<int
d710: 65 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c  eger>%*s  %s\n",
d720: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20  op[i].label,.   
d730: 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78         (int)(max
d740: 2d 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61  -strlen(op[i].la
d750: 62 65 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d  bel)-9),"",op[i]
d760: 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20  .message);.     
d770: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d780: 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20  case OPT_DBL:.  
d790: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42      case OPT_FDB
d7a0: 4c 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  L:.        fprin
d7b0: 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20  tf(errstream,"  
d7c0: 25 73 3d 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73  %s=<real>%*s  %s
d7d0: 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c  \n",op[i].label,
d7e0: 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29  .          (int)
d7f0: 28 6d 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b 69  (max-strlen(op[i
d800: 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f  ].label)-6),"",o
d810: 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20  p[i].message);. 
d820: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d830: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52      case OPT_STR
d840: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d850: 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66  _FSTR:.        f
d860: 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d  printf(errstream
d870: 2c 22 20 20 25 73 3d 3c 73 74 72 69 6e 67 3e 25  ,"  %s=<string>%
d880: 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
d890: 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
d8a0: 20 28 69 6e 74 29 28 6d 61 78 2d 73 74 72 6c 65   (int)(max-strle
d8b0: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38  n(op[i].label)-8
d8c0: 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  ),"",op[i].messa
d8d0: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
d8e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
d8f0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
d900: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
d910: 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22  e file "parse.c"
d920: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
d930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
d940: 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20  *.** Input file 
d950: 70 61 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c  parser for the L
d960: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
d970: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68  rator..*/../* Th
d980: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
d990: 61 72 73 65 72 20 2a 2f 0a 73 74 72 75 63 74 20  arser */.struct 
d9a0: 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61 72 20  pstate {.  char 
d9b0: 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  *filename;      
d9c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
d9d0: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
d9e0: 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  int tokenlineno;
d9f0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d        /* Linenum
da00: 62 65 72 20 61 74 20 77 68 69 63 68 20 63 75 72  ber at which cur
da10: 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72 74  rent token start
da20: 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72  s */.  int error
da30: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  cnt;         /* 
da40: 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
da50: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61   so far */.  cha
da60: 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20 20  r *tokenstart;  
da70: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 63 75     /* Text of cu
da80: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20  rrent token */. 
da90: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67   struct lemon *g
daa0: 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c  p;     /* Global
dab0: 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 2a 2f   state vector */
dac0: 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74 65 20  .  enum e_state 
dad0: 7b 0a 20 20 20 20 49 4e 49 54 49 41 4c 49 5a 45  {.    INITIALIZE
dae0: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
daf0: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a  R_DECL_OR_RULE,.
db00: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
db10: 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20  DECL_KEYWORD,.  
db20: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
db30: 43 4c 5f 41 52 47 2c 0a 20 20 20 20 57 41 49 54  CL_ARG,.    WAIT
db40: 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
db50: 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57  CE_SYMBOL,.    W
db60: 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57  AITING_FOR_ARROW
db70: 2c 0a 20 20 20 20 49 4e 5f 52 48 53 2c 0a 20 20  ,.    IN_RHS,.  
db80: 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20    LHS_ALIAS_1,. 
db90: 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a     LHS_ALIAS_2,.
dba0: 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c      LHS_ALIAS_3,
dbb0: 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 31  .    RHS_ALIAS_1
dbc0: 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f  ,.    RHS_ALIAS_
dbd0: 32 2c 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43  2,.    PRECEDENC
dbe0: 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 20 20 50 52  E_MARK_1,.    PR
dbf0: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c  ECEDENCE_MARK_2,
dc00: 0a 20 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45  .    RESYNC_AFTE
dc10: 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20  R_RULE_ERROR,.  
dc20: 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44    RESYNC_AFTER_D
dc30: 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 20 20 57  ECL_ERROR,.    W
dc40: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52  AITING_FOR_DESTR
dc50: 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20  UCTOR_SYMBOL,.  
dc60: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41    WAITING_FOR_DA
dc70: 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20  TATYPE_SYMBOL,. 
dc80: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46     WAITING_FOR_F
dc90: 41 4c 4c 42 41 43 4b 5f 49 44 0a 20 20 7d 20 73  ALLBACK_ID.  } s
dca0: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
dcb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
dcc0: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72 73  tate of the pars
dcd0: 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  er */.  struct s
dce0: 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b  ymbol *fallback;
dcf0: 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61     /* The fallba
dd00: 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74  ck token */.  st
dd10: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73  ruct symbol *lhs
dd20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74  ;        /* Left
dd30: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 75  -hand side of cu
dd40: 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20  rrent rule */.  
dd50: 63 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20  char *lhsalias; 
dd60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
dd70: 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20  ias for the LHS 
dd80: 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20  */.  int nrhs;  
dd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dda0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 69 67  /* Number of rig
ddb0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 73 79 6d  ht-hand side sym
ddc0: 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73  bols seen */.  s
ddd0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68  truct symbol *rh
dde0: 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52  s[MAXRHS];  /* R
ddf0: 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  HS symbols */.  
de00: 63 68 61 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52  char *alias[MAXR
de10: 48 53 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  HS];       /* Al
de20: 69 61 73 65 73 20 66 6f 72 20 65 61 63 68 20 52  iases for each R
de30: 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55  HS symbol (or NU
de40: 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  LL) */.  struct 
de50: 72 75 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b 20  rule *prevrule; 
de60: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
de70: 72 75 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a 20  rule parsed */. 
de80: 20 63 68 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f   char *declkeywo
de90: 72 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  rd;         /* K
dea0: 65 79 77 6f 72 64 20 6f 66 20 61 20 64 65 63 6c  eyword of a decl
deb0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61  aration */.  cha
dec0: 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b  r **declargslot;
ded0: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
dee0: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
def0: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
df00: 20 62 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74   be put */.  int
df10: 20 2a 64 65 63 6c 6c 6e 73 6c 6f 74 3b 20 20 20   *decllnslot;   
df20: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
df30: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
df40: 20 6c 69 6e 65 6e 75 6d 62 65 72 20 69 73 20 70   linenumber is p
df50: 75 74 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ut */.  enum e_a
df60: 73 73 6f 63 20 64 65 63 6c 61 73 73 6f 63 3b 20  ssoc declassoc; 
df70: 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69     /* Assign thi
df80: 73 20 61 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f  s association to
df90: 20 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20   decl arguments 
dfa0: 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 63 6f 75  */.  int preccou
dfb0: 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  nter;           
dfc0: 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20 70  /* Assign this p
dfd0: 72 65 63 65 64 65 6e 63 65 20 74 6f 20 64 65 63  recedence to dec
dfe0: 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  l arguments */. 
dff0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 66 69   struct rule *fi
e000: 72 73 74 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50  rstrule;    /* P
e010: 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20  ointer to first 
e020: 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d  rule in the gram
e030: 6d 61 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  mar */.  struct 
e040: 72 75 6c 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20  rule *lastrule; 
e050: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
e060: 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
e070: 74 6c 79 20 70 61 72 73 65 64 20 72 75 6c 65 20  tly parsed rule 
e080: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20  */.};../* Parse 
e090: 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a  a single token *
e0a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
e0b0: 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 70 73 70 29  rseonetoken(psp)
e0c0: 0a 73 74 72 75 63 74 20 70 73 74 61 74 65 20 2a  .struct pstate *
e0d0: 70 73 70 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 78  psp;.{.  char *x
e0e0: 3b 0a 20 20 78 20 3d 20 53 74 72 73 61 66 65 28  ;.  x = Strsafe(
e0f0: 70 73 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29  psp->tokenstart)
e100: 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68  ;     /* Save th
e110: 65 20 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e  e token permanen
e120: 74 6c 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70  tly */.#if 0.  p
e130: 72 69 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f  rintf("%s:%d: To
e140: 6b 65 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25  ken=[%s] state=%
e150: 64 5c 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61  d\n",psp->filena
e160: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
e170: 65 6e 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e  eno,.    x,psp->
e180: 73 74 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20  state);.#endif. 
e190: 20 73 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74   switch( psp->st
e1a0: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
e1b0: 49 4e 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20  INITIALIZE:.    
e1c0: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
e1d0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e  = 0;.      psp->
e1e0: 70 72 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b  preccounter = 0;
e1f0: 0a 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73  .      psp->firs
e200: 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73  trule = psp->las
e210: 74 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  trule = 0;.     
e220: 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20   psp->gp->nrule 
e230: 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  = 0;.      /* Fa
e240: 6c 6c 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20  ll thru to next 
e250: 63 61 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65  case */.    case
e260: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
e270: 4c 5f 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20  L_OR_RULE:.     
e280: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29   if( x[0]=='%' )
e290: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
e2a0: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
e2b0: 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b  OR_DECL_KEYWORD;
e2c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e2d0: 20 69 73 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29   islower(x[0]) )
e2e0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c  {.        psp->l
e2f0: 68 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  hs = Symbol_new(
e300: 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
e310: 3e 6e 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20  >nrhs = 0;.     
e320: 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73     psp->lhsalias
e330: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
e340: 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
e350: 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20  NG_FOR_ARROW;.  
e360: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
e370: 30 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20  0]=='{' ){.     
e380: 20 20 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76     if( psp->prev
e390: 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
e3a0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
e3b0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
e3c0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54  >tokenlineno,."T
e3d0: 68 65 72 65 20 69 73 20 6e 6f 74 20 70 72 69 6f  here is not prio
e3e0: 72 20 72 75 6c 65 20 6f 70 6f 6e 20 77 68 69 63  r rule opon whic
e3f0: 68 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20  h to attach the 
e400: 63 6f 64 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20  code \.fragment 
e410: 77 68 69 63 68 20 62 65 67 69 6e 73 20 6f 6e 20  which begins on 
e420: 74 68 69 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20  this line.");.  
e430: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
e440: 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 20  orcnt++;..}else 
e450: 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c  if( psp->prevrul
e460: 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20  e->code!=0 ){.  
e470: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
e480: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
e490: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
e4a0: 0a 22 43 6f 64 65 20 66 72 61 67 6d 65 6e 74 20  ."Code fragment 
e4b0: 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69  beginning on thi
e4c0: 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  s line is not th
e4d0: 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c  e first \.to fol
e4e0: 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75 73  low the previous
e4f0: 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   rule.");.      
e500: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
e510: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
e520: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73  se{.          ps
e530: 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e  p->prevrule->lin
e540: 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  e = psp->tokenli
e550: 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  neno;.          
e560: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63  psp->prevrule->c
e570: 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 09 7d 0a  ode = &x[1];..}.
e580: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e590: 78 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  x[0]=='[' ){.   
e5a0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
e5b0: 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52  = PRECEDENCE_MAR
e5c0: 4b 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  K_1;.      }else
e5d0: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
e5e0: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
e5f0: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
e600: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 6f  o,.          "To
e610: 6b 65 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c  ken \"%s\" shoul
e620: 64 20 62 65 20 65 69 74 68 65 72 20 5c 22 25 25  d be either \"%%
e630: 5c 22 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69  \" or a nontermi
e640: 6e 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20  nal name.",.    
e650: 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20        x);.      
e660: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
e670: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
e680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
e690: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
e6a0: 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69  _1:.      if( !i
e6b0: 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a  supper(x[0]) ){.
e6c0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
e6d0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
e6e0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
e6f0: 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65 20  .          "The 
e700: 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f  precedence symbo
e710: 6c 20 6d 75 73 74 20 62 65 20 61 20 74 65 72 6d  l must be a term
e720: 69 6e 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20  inal.");.       
e730: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
e740: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e750: 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d  ( psp->prevrule=
e760: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
e770: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
e780: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
e790: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
e7a0: 20 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72   "There is no pr
e7b0: 69 6f 72 20 72 75 6c 65 20 74 6f 20 61 73 73 69  ior rule to assi
e7c0: 67 6e 20 70 72 65 63 65 64 65 6e 63 65 20 5c 22  gn precedence \"
e7d0: 5b 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  [%s]\".",x);.   
e7e0: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
e7f0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
e800: 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72  e if( psp->prevr
e810: 75 6c 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20  ule->precsym!=0 
e820: 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
e830: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
e840: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
e850: 6e 6f 2c 0a 22 50 72 65 63 65 64 65 6e 63 65 20  no,."Precedence 
e860: 6d 61 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e  mark on this lin
e870: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72  e is not the fir
e880: 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74  st \.to follow t
e890: 68 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65  he previous rule
e8a0: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  .");.        psp
e8b0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
e8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e8d0: 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
e8e0: 2d 3e 70 72 65 63 73 79 6d 20 3d 20 53 79 6d 62  ->precsym = Symb
e8f0: 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
e900: 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74   }.      psp->st
e910: 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45  ate = PRECEDENCE
e920: 5f 4d 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62  _MARK_2;.      b
e930: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50  reak;.    case P
e940: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
e950: 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
e960: 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  !=']' ){.       
e970: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
e980: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
e990: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
e9a0: 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d      "Missing \"]
e9b0: 5c 22 20 6f 6e 20 70 72 65 63 65 64 65 6e 63 65  \" on precedence
e9c0: 20 6d 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20   mark.");.      
e9d0: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
e9e0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
e9f0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
ea00: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
ea10: 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 62 72  R_RULE;.      br
ea20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
ea30: 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a  ITING_FOR_ARROW:
ea40: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
ea50: 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a  =':' && x[1]==':
ea60: 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29  ' && x[2]=='=' )
ea70: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
ea80: 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20  tate = IN_RHS;. 
ea90: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78       }else if( x
eaa0: 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20  [0]=='(' ){.    
eab0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
eac0: 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20   LHS_ALIAS_1;.  
ead0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
eae0: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
eaf0: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
eb00: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
eb10: 20 20 20 20 20 20 22 45 78 70 65 63 74 65 64 20        "Expected 
eb20: 74 6f 20 73 65 65 20 61 20 5c 22 3a 5c 22 20 66  to see a \":\" f
eb30: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48 53  ollowing the LHS
eb40: 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22   symbol \"%s\"."
eb50: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ,.          psp-
eb60: 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
eb70: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
eb80: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
eb90: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
eba0: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
ebb0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
ebc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
ebd0: 65 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20  e LHS_ALIAS_1:. 
ebe0: 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61       if( isalpha
ebf0: 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
ec00: 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20    psp->lhsalias 
ec10: 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
ec20: 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
ec30: 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_2;.      }el
ec40: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
ec50: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
ec60: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
ec70: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
ec80: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20  \"%s\" is not a 
ec90: 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20  valid alias for 
eca0: 74 68 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e  the LHS \"%s\"\n
ecb0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70  ",.          x,p
ecc0: 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  sp->lhs->name);.
ecd0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
ece0: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
ecf0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
ed00: 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
ed10: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
ed20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ed30: 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32  case LHS_ALIAS_2
ed40: 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
ed50: 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20  ==')' ){.       
ed60: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48   psp->state = LH
ed70: 53 5f 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20  S_ALIAS_3;.     
ed80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ed90: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
eda0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
edb0: 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
edc0: 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c     "Missing \")\
edd0: 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20  " following LHS 
ede0: 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c  alias name \"%s\
edf0: 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ".",psp->lhsalia
ee00: 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
ee10: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
ee20: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
ee30: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
ee40: 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
ee50: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
ee60: 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49      case LHS_ALI
ee70: 41 53 5f 33 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_3:.      if( 
ee80: 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31  x[0]==':' && x[1
ee90: 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d  ]==':' && x[2]==
eea0: 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '=' ){.        p
eeb0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
eec0: 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  HS;.      }else{
eed0: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
eee0: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
eef0: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
ef00: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
ef10: 73 69 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c  sing \"->\" foll
ef20: 6f 77 69 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c  owing: \"%s(%s)\
ef30: 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ".",.           
ef40: 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70  psp->lhs->name,p
ef50: 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20  sp->lhsalias);. 
ef60: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
ef70: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
ef80: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
ef90: 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
efa0: 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
efb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
efc0: 61 73 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20  ase IN_RHS:.    
efd0: 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
efe0: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
eff0: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20  t rule *rp;.    
f000: 20 20 20 20 72 70 20 3d 20 28 73 74 72 75 63 74      rp = (struct
f010: 20 72 75 6c 65 20 2a 29 6d 61 6c 6c 6f 63 28 20   rule *)malloc( 
f020: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 72 75  sizeof(struct ru
f030: 6c 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20  le) + .         
f040: 20 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63      sizeof(struc
f050: 74 20 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e  t symbol*)*psp->
f060: 6e 72 68 73 20 2b 20 73 69 7a 65 6f 66 28 63 68  nrhs + sizeof(ch
f070: 61 72 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 29  ar*)*psp->nrhs )
f080: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
f090: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
f0a0: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f0b0: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f0c0: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f0d0: 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 6c 6c        "Can't all
f0e0: 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d  ocate enough mem
f0f0: 6f 72 79 20 66 6f 72 20 74 68 69 73 20 72 75 6c  ory for this rul
f100: 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e.");.          
f110: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
f120: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
f130: 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 09 7d  prevrule = 0;..}
f140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f150: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
f160: 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20   rp->ruleline = 
f170: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f180: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
f190: 72 68 73 20 3d 20 28 73 74 72 75 63 74 20 73 79  rhs = (struct sy
f1a0: 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20  mbol**)&rp[1];. 
f1b0: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
f1c0: 61 6c 69 61 73 20 3d 20 28 63 68 61 72 2a 2a 29  alias = (char**)
f1d0: 26 28 72 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e  &(rp->rhs[psp->n
f1e0: 72 68 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  rhs]);.         
f1f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d   for(i=0; i<psp-
f200: 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
f210: 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73           rp->rhs
f220: 5b 69 5d 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69  [i] = psp->rhs[i
f230: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ];.            r
f240: 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d  p->rhsalias[i] =
f250: 20 70 73 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a   psp->alias[i];.
f260: 09 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72  .  }.          r
f270: 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68  p->lhs = psp->lh
f280: 73 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  s;.          rp-
f290: 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d  >lhsalias = psp-
f2a0: 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20  >lhsalias;.     
f2b0: 20 20 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20       rp->nrhs = 
f2c0: 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20  psp->nrhs;.     
f2d0: 20 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20       rp->code = 
f2e0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  0;.          rp-
f2f0: 3e 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20  >precsym = 0;.  
f300: 20 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65          rp->inde
f310: 78 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75  x = psp->gp->nru
f320: 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  le++;.          
f330: 72 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70  rp->nextlhs = rp
f340: 2d 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20  ->lhs->rule;.   
f350: 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e         rp->lhs->
f360: 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20  rule = rp;.     
f370: 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20       rp->next = 
f380: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
f390: 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d   psp->firstrule=
f3a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
f3b0: 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65    psp->firstrule
f3c0: 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65   = psp->lastrule
f3d0: 20 3d 20 72 70 3b 0a 09 20 20 7d 65 6c 73 65 7b   = rp;..  }else{
f3e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70  .            psp
f3f0: 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e 65 78 74  ->lastrule->next
f400: 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20   = rp;.         
f410: 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65     psp->lastrule
f420: 20 3d 20 72 70 3b 0a 09 20 20 7d 0a 20 20 20 20   = rp;..  }.    
f430: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
f440: 75 6c 65 20 3d 20 72 70 3b 0a 09 7d 0a 20 20 20  ule = rp;..}.   
f450: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f460: 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
f470: 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
f480: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 61 6c    }else if( isal
f490: 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
f4a0: 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 6e 72       if( psp->nr
f4b0: 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20  hs>=MAXRHS ){.  
f4c0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f4d0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f4e0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 54 6f  .            "To
f500: 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c 20 6f 6e  o many symbol on
f510: 20 52 48 53 20 6f 72 20 72 75 6c 65 20 62 65 67   RHS or rule beg
f520: 69 6e 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c 22  inning at \"%s\"
f530: 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  .",.            
f540: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
f550: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f560: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
f570: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
f580: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 09  ER_RULE_ERROR;..
f590: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f5a0: 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e   psp->rhs[psp->n
f5b0: 72 68 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  rhs] = Symbol_ne
f5c0: 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  w(x);.          
f5d0: 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e  psp->alias[psp->
f5e0: 6e 72 68 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20  nrhs] = 0;.     
f5f0: 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b       psp->nrhs++
f600: 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ;..}.      }else
f610: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26   if( x[0]=='(' &
f620: 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b  & psp->nrhs>0 ){
f630: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
f640: 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f  ate = RHS_ALIAS_
f650: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
f660: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f670: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f680: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f690: 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65  .          "Ille
f6a0: 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e  gal character on
f6b0: 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22   RHS of rule: \"
f6c0: 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
f6d0: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
f6e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
f6f0: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
f700: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
f710: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f720: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
f730: 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20  RHS_ALIAS_1:.   
f740: 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78     if( isalpha(x
f750: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
f760: 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e  psp->alias[psp->
f770: 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20  nrhs-1] = x;.   
f780: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f790: 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20  = RHS_ALIAS_2;. 
f7a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f7b0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f7c0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f7d0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
f7e0: 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69         "\"%s\" i
f7f0: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c  s not a valid al
f800: 69 61 73 20 66 6f 72 20 74 68 65 20 52 48 53 20  ias for the RHS 
f810: 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22  symbol \"%s\"\n"
f820: 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73  ,.          x,ps
f830: 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73  p->rhs[psp->nrhs
f840: 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  -1]->name);.    
f850: 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
f860: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
f870: 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
f880: 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
f890: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
f8a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
f8b0: 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20   RHS_ALIAS_2:.  
f8c0: 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29      if( x[0]==')
f8d0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
f8e0: 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53  ->state = IN_RHS
f8f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f900: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f910: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f920: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f930: 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
f940: 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69  ng \")\" followi
f950: 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d  ng LHS alias nam
f960: 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e  e \"%s\".",psp->
f970: 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20  lhsalias);.     
f980: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
f990: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
f9a0: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
f9b0: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
f9c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f9d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
f9e0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
f9f0: 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20  _KEYWORD:.      
fa00: 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d  if( isalpha(x[0]
fa10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ) ){.        psp
fa20: 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20  ->declkeyword = 
fa30: 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  x;.        psp->
fa40: 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b  declargslot = 0;
fa50: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
fa60: 63 6c 6c 6e 73 6c 6f 74 20 3d 20 30 3b 0a 20 20  cllnslot = 0;.  
fa70: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
fa80: 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
fa90: 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20  ECL_ARG;.       
faa0: 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e   if( strcmp(x,"n
fab0: 61 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ame")==0 ){.    
fac0: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
fad0: 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
fae0: 67 70 2d 3e 6e 61 6d 65 29 3b 0a 09 7d 65 6c 73  gp->name);..}els
faf0: 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
fb00: 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a  include")==0 ){.
fb10: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
fb20: 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
fb30: 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29  sp->gp->include)
fb40: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
fb50: 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70  >decllnslot = &p
fb60: 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 6c  sp->gp->includel
fb70: 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  n;..}else if( st
fb80: 72 63 6d 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d  rcmp(x,"code")==
fb90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
fba0: 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
fbb0: 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74  = &(psp->gp->ext
fbc0: 72 61 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 20  racode);.       
fbd0: 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c     psp->decllnsl
fbe0: 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 65  ot = &psp->gp->e
fbf0: 78 74 72 61 63 6f 64 65 6c 6e 3b 0a 09 7d 65 6c  xtracodeln;..}el
fc00: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
fc10: 22 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f  "token_destructo
fc20: 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
fc30: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
fc40: 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
fc50: 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20  >tokendest;.    
fc60: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
fc70: 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  nslot = &psp->gp
fc80: 2d 3e 74 6f 6b 65 6e 64 65 73 74 6c 6e 3b 0a 09  ->tokendestln;..
fc90: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
fca0: 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73 74  (x,"default_dest
fcb0: 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  ructor")==0 ){. 
fcc0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
fcd0: 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70  clargslot = &psp
fce0: 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20  ->gp->vardest;. 
fcf0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
fd00: 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d  cllnslot = &psp-
fd10: 3e 67 70 2d 3e 76 61 72 64 65 73 74 6c 6e 3b 0a  >gp->vardestln;.
fd20: 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
fd30: 70 28 78 2c 22 74 6f 6b 65 6e 5f 70 72 65 66 69  p(x,"token_prefi
fd40: 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  x")==0 ){.      
fd50: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
fd60: 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d  slot = &psp->gp-
fd70: 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 09 7d  >tokenprefix;..}
fd80: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
fd90: 78 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22  x,"syntax_error"
fda0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
fdb0: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
fdc0: 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
fdd0: 65 72 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  error);.        
fde0: 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f    psp->decllnslo
fdf0: 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 65 72  t = &psp->gp->er
fe00: 72 6f 72 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66  rorln;..}else if
fe10: 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73  ( strcmp(x,"pars
fe20: 65 5f 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b  e_accept")==0 ){
fe30: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
fe40: 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
fe50: 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29  psp->gp->accept)
fe60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
fe70: 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70  >decllnslot = &p
fe80: 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 6c 6e  sp->gp->acceptln
fe90: 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
fea0: 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69  cmp(x,"parse_fai
feb0: 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lure")==0 ){.   
fec0: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
fed0: 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
fee0: 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20  >gp->failure);. 
fef0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
ff00: 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d  cllnslot = &psp-
ff10: 3e 67 70 2d 3e 66 61 69 6c 75 72 65 6c 6e 3b 0a  >gp->failureln;.
ff20: 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
ff30: 70 28 78 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66  p(x,"stack_overf
ff40: 6c 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  low")==0 ){.    
ff50: 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
ff60: 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
ff70: 67 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20  gp->overflow);. 
ff80: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
ff90: 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d  cllnslot = &psp-
ffa0: 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f 77 6c 6e 3b  >gp->overflowln;
ffb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
ffc0: 66 28 20 73 74 72 63 6d 70 28 78 2c 22 65 78 74  f( strcmp(x,"ext
ffd0: 72 61 5f 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30  ra_argument")==0
ffe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
fff0: 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10000 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29   &(psp->gp->arg)
10010 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10020 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
10030 6b 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b  ken_type")==0 ){
10040 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10050 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10060 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79  psp->gp->tokenty
10070 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  pe);.        }el
10080 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
10090 22 64 65 66 61 75 6c 74 5f 74 79 70 65 22 29 3d  "default_type")=
100a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
100b0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
100c0 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61   = &(psp->gp->va
100d0 72 74 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20  rtype);.        
100e0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
100f0 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29  (x,"stack_size")
10100 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10110 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10120 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73  t = &(psp->gp->s
10130 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20  tacksize);.     
10140 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10150 63 6d 70 28 78 2c 22 73 74 61 72 74 5f 73 79 6d  cmp(x,"start_sym
10160 62 6f 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  bol")==0 ){.    
10170 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
10180 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
10190 67 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20  gp->start);.    
101a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
101b0 72 63 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d 3d  rcmp(x,"left")==
101c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
101d0 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b  sp->preccounter+
101e0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
101f0 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c 45  ->declassoc = LE
10200 46 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  FT;.          ps
10210 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
10220 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
10230 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  E_SYMBOL;.      
10240 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10250 6d 70 28 78 2c 22 72 69 67 68 74 22 29 3d 3d 30  mp(x,"right")==0
10260 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10270 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b  p->preccounter++
10280 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10290 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 52 49 47  >declassoc = RIG
102a0 48 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  HT;.          ps
102b0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
102c0 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
102d0 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  E_SYMBOL;.      
102e0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
102f0 6d 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22 29  mp(x,"nonassoc")
10300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10310 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65   psp->preccounte
10320 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r++;.          p
10330 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20  sp->declassoc = 
10340 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20  NONE;.          
10350 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
10360 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
10370 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c  NCE_SYMBOL;..}el
10380 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
10390 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  "destructor")==0
103a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
103b0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
103c0 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f  NG_FOR_DESTRUCTO
103d0 52 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65  R_SYMBOL;..}else
103e0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
103f0 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ype")==0 ){.    
10400 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10410 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
10420 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a  ATATYPE_SYMBOL;.
10430 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10440 28 20 73 74 72 63 6d 70 28 78 2c 22 66 61 6c 6c  ( strcmp(x,"fall
10450 62 61 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20  back")==0 ){.   
10460 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c         psp->fall
10470 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  back = 0;.      
10480 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10490 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c   WAITING_FOR_FAL
104a0 4c 42 41 43 4b 5f 49 44 3b 0a 20 20 20 20 20 20  LBACK_ID;.      
104b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
104c0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
104d0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
104e0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
104f0 20 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e          "Unknown
10500 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79   declaration key
10510 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22  word: \"%%%s\"."
10520 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ,x);.          p
10530 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10540 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
10550 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
10560 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
10570 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .}.      }else{.
10580 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
10590 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
105a0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
105b0 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65  .          "Ille
105c0 67 61 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  gal declaration 
105d0 6b 65 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e  keyword: \"%s\".
105e0 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ",x);.        ps
105f0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
10600 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10610 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
10620 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
10630 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
10640 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
10650 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f  NG_FOR_DESTRUCTO
10660 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20  R_SYMBOL:.      
10670 69 66 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30  if( !isalpha(x[0
10680 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ]) ){.        Er
10690 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
106a0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
106b0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
106c0 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69   "Symbol name mi
106d0 73 73 69 6e 67 20 61 66 74 65 72 20 25 64 65 73  ssing after %des
106e0 74 72 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22  tructor keyword"
106f0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
10700 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10710 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10720 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
10730 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
10740 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
10750 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
10760 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
10770 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  ;.        psp->d
10780 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70  eclargslot = &sp
10790 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  ->destructor;.  
107a0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
107b0 6e 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73  nslot = &sp->des
107c0 74 72 75 63 74 6f 72 6c 6e 3b 0a 20 20 20 20 20  tructorln;.     
107d0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
107e0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
107f0 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _ARG;.      }.  
10800 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
10810 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
10820 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a  DATATYPE_SYMBOL:
10830 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 61 6c  .      if( !isal
10840 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
10850 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
10860 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
10870 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
10880 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20          "Symbol 
10890 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74  name missing aft
108a0 65 72 20 25 64 65 73 74 72 75 63 74 6f 72 20 6b  er %destructor k
108b0 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20  eyword");.      
108c0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
108d0 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
108e0 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
108f0 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
10900 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10910 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
10920 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c  bol *sp = Symbol
10930 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
10940 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10950 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74 79 70  t = &sp->datatyp
10960 65 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  e;.        psp->
10970 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 30 3b 0a  decllnslot = 0;.
10980 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10990 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
109a0 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20  _DECL_ARG;.     
109b0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
109c0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
109d0 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
109e0 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
109f0 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
10a00 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10a10 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
10a20 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
10a30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
10a40 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20  upper(x[0]) ){. 
10a50 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79         struct sy
10a60 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20 20 20 20  mbol *sp;.      
10a70 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65    sp = Symbol_ne
10a80 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  w(x);.        if
10a90 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  ( sp->prec>=0 ){
10aa0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
10ab0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
10ac0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
10ad0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
10ae0 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 68  "Symbol \"%s\" h
10af0 61 73 20 61 6c 72 65 61 64 79 20 62 65 20 67 69  as already be gi
10b00 76 65 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65  ven a precedence
10b10 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20  .",x);.         
10b20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
10b30 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20  ;..}else{.      
10b40 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 70      sp->prec = p
10b50 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 3b  sp->preccounter;
10b60 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 61  .          sp->a
10b70 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64 65 63 6c  ssoc = psp->decl
10b80 61 73 73 6f 63 3b 0a 09 7d 0a 20 20 20 20 20 20  assoc;..}.      
10b90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
10ba0 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10bb0 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
10bc0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
10bd0 20 20 22 43 61 6e 27 74 20 61 73 73 69 67 6e 20    "Can't assign 
10be0 61 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20  a precedence to 
10bf0 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  \"%s\".",x);.   
10c00 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
10c10 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
10c20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
10c30 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
10c40 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20 20 20 20  DECL_ARG:.      
10c50 69 66 28 20 28 78 5b 30 5d 3d 3d 27 7b 27 20 7c  if( (x[0]=='{' |
10c60 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20  | x[0]=='\"' || 
10c70 69 73 61 6c 6e 75 6d 28 78 5b 30 5d 29 29 20 29  isalnum(x[0])) )
10c80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 28  {.        if( *(
10c90 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10ca0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
10cb0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
10cc0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
10cd0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
10ce0 20 20 20 20 20 20 20 22 54 68 65 20 61 72 67 75         "The argu
10cf0 6d 65 6e 74 20 5c 22 25 73 5c 22 20 74 6f 20 64  ment \"%s\" to d
10d00 65 63 6c 61 72 61 74 69 6f 6e 20 5c 22 25 25 25  eclaration \"%%%
10d10 73 5c 22 20 69 73 20 6e 6f 74 20 74 68 65 20 66  s\" is not the f
10d20 69 72 73 74 2e 22 2c 0a 20 20 20 20 20 20 20 20  irst.",.        
10d30 20 20 20 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 3f      x[0]=='\"' ?
10d40 20 26 78 5b 31 5d 20 3a 20 78 2c 70 73 70 2d 3e   &x[1] : x,psp->
10d50 64 65 63 6c 6b 65 79 77 6f 72 64 29 3b 0a 20 20  declkeyword);.  
10d60 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
10d70 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
10d80 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10d90 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
10da0 4c 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b  L_ERROR;..}else{
10db0 0a 20 20 20 20 20 20 20 20 20 20 2a 28 70 73 70  .          *(psp
10dc0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 29 20 3d  ->declargslot) =
10dd0 20 28 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20   (x[0]=='\"' || 
10de0 78 5b 30 5d 3d 3d 27 7b 27 29 20 3f 20 26 78 5b  x[0]=='{') ? &x[
10df0 31 5d 20 3a 20 78 3b 0a 20 20 20 20 20 20 20 20  1] : x;.        
10e00 20 20 69 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c    if( psp->decll
10e10 6e 73 6c 6f 74 20 29 20 2a 70 73 70 2d 3e 64 65  nslot ) *psp->de
10e20 63 6c 6c 6e 73 6c 6f 74 20 3d 20 70 73 70 2d 3e  cllnslot = psp->
10e30 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20  tokenlineno;.   
10e40 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10e50 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
10e60 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 09 7d  DECL_OR_RULE;..}
10e70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10e80 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10e90 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10ea0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
10eb0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
10ec0 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 25  l argument to %%
10ed0 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65 63  %s: %s",psp->dec
10ee0 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20  lkeyword,x);.   
10ef0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
10f00 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
10f10 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
10f20 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
10f30 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
10f40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10f50 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41  e WAITING_FOR_FA
10f60 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20  LLBACK_ID:.     
10f70 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
10f80 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
10f90 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
10fa0 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
10fb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
10fc0 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20   !isupper(x[0]) 
10fd0 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  ){.        Error
10fe0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
10ff0 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
11000 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
11010 25 25 66 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d  %%fallback argum
11020 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c  ent \"%s\" shoul
11030 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78  d be a token", x
11040 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
11050 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11070 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
11080 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
11090 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
110a0 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30  psp->fallback==0
110b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
110c0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70  p->fallback = sp
110d0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
110e0 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b  if( sp->fallback
110f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
11100 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11110 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e  name, psp->token
11120 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
11130 20 20 20 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f      "More than o
11140 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61 73 73 69  ne fallback assi
11150 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73  gned to token %s
11160 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20  ", x);.         
11170 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11180 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11190 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 66  .          sp->f
111a0 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66  allback = psp->f
111b0 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  allback;.       
111c0 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f     psp->gp->has_
111d0 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  fallback = 1;.  
111e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
111f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11200 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54   case RESYNC_AFT
11210 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f  ER_RULE_ERROR:./
11220 2a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  *      if( x[0]=
11230 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74  ='.' ) psp->stat
11240 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11250 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a  DECL_OR_RULE;.**
11260 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f 0a        break; */.
11270 20 20 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f      case RESYNC_
11280 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
11290 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
112a0 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61  =='.' ) psp->sta
112b0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
112c0 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
112d0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
112e0 25 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20  %' ) psp->state 
112f0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
11300 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20  CL_KEYWORD;.    
11310 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a    break;.  }.}..
11320 2f 2a 20 49 6e 20 73 70 69 74 65 20 6f 66 20 69  /* In spite of i
11330 74 73 20 6e 61 6d 65 2c 20 74 68 69 73 20 66 75  ts name, this fu
11340 6e 63 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79  nction is really
11350 20 61 20 73 63 61 6e 6e 65 72 2e 20 20 49 74 20   a scanner.  It 
11360 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65  read.** in the e
11370 6e 74 69 72 65 20 69 6e 70 75 74 20 66 69 6c 65  ntire input file
11380 20 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74   (all at once) t
11390 68 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74  hen tokenizes it
113a0 2e 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e  .  Each.** token
113b0 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
113c0 65 20 66 75 6e 63 74 69 6f 6e 20 22 70 61 72 73  e function "pars
113d0 65 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63 68  eonetoken" which
113e0 20 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74   builds all.** t
113f0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 64  he appropriate d
11400 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 69  ata structures i
11410 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 74 61  n the global sta
11420 74 65 20 76 65 63 74 6f 72 20 22 67 70 22 2e 0a  te vector "gp"..
11430 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 67 70  */.void Parse(gp
11440 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
11450 67 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70  gp;.{.  struct p
11460 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c 45  state ps;.  FILE
11470 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66 69   *fp;.  char *fi
11480 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c  lebuf;.  int fil
11490 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e  esize;.  int lin
114a0 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20  eno;.  int c;.  
114b0 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63  char *cp, *nextc
114c0 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69  p;.  int startli
114d0 6e 65 20 3d 20 30 3b 0a 0a 20 20 70 73 2e 67 70  ne = 0;..  ps.gp
114e0 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65   = gp;.  ps.file
114f0 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e  name = gp->filen
11500 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63  ame;.  ps.errorc
11510 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61  nt = 0;.  ps.sta
11520 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b  te = INITIALIZE;
11530 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
11540 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75  reading the inpu
11550 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d  t file */.  fp =
11560 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61   fopen(ps.filena
11570 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20  me,"rb");.  if( 
11580 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72  fp==0 ){.    Err
11590 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
115a0 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  e,0,"Can't open 
115b0 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65  this file for re
115c0 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70  ading.");.    gp
115d0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
115e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
115f0 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20  fseek(fp,0,2);. 
11600 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c   filesize = ftel
11610 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28  l(fp);.  rewind(
11620 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d  fp);.  filebuf =
11630 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
11640 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20   filesize+1 );. 
11650 20 69 66 28 20 66 69 6c 65 62 75 66 3d 3d 30 20   if( filebuf==0 
11660 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  ){.    ErrorMsg(
11670 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43  ps.filename,0,"C
11680 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 25 64  an't allocate %d
11690 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f   of memory to ho
116a0 6c 64 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a  ld this file.",.
116b0 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 2b 31        filesize+1
116c0 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72  );.    gp->error
116d0 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
116e0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  n;.  }.  if( fre
116f0 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c  ad(filebuf,1,fil
11700 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73  esize,fp)!=files
11710 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ize ){.    Error
11720 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
11730 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e  0,"Can't read in
11740 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66   all %d bytes of
11750 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20   this file.",.  
11760 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20      filesize);. 
11770 20 20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29     free(filebuf)
11780 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63  ;.    gp->errorc
11790 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
117a0 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
117b0 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69  p);.  filebuf[fi
117c0 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20  lesize] = 0;..  
117d0 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68 65 20  /* Now scan the 
117e0 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e 70 75  text of the inpu
117f0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65  t file */.  line
11800 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 63 70  no = 1;.  for(cp
11810 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d 20 2a 63  =filebuf; (c= *c
11820 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20 69 66  p)!=0; ){.    if
11830 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
11840 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  no++;           
11850 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61 63 6b     /* Keep track
11860 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d   of the line num
11870 62 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ber */.    if( i
11880 73 73 70 61 63 65 28 63 29 20 29 7b 20 63 70 2b  sspace(c) ){ cp+
11890 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 20 20  +; continue; }  
118a0 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68 69 74  /* Skip all whit
118b0 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  e space */.    i
118c0 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b  f( c=='/' && cp[
118d0 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20 20 20  1]=='/' ){      
118e0 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20      /* Skip C++ 
118f0 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a  style comments *
11900 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20  /.      cp+=2;. 
11910 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
11920 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  *cp)!=0 && c!='\
11930 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20  n' ) cp++;.     
11940 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
11950 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20  .    if( c=='/' 
11960 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b  && cp[1]=='*' ){
11970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69            /* Ski
11980 70 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e  p C style commen
11990 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d  ts */.      cp+=
119a0 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  2;.      while( 
119b0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
119c0 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d  c!='/' || cp[-1]
119d0 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20  !='*') ){.      
119e0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
119f0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
11a00 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a    cp++;.      }.
11a10 20 20 20 20 20 20 69 66 28 20 63 20 29 20 63 70        if( c ) cp
11a20 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ++;.      contin
11a30 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 73  ue;.    }.    ps
11a40 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20 63 70  .tokenstart = cp
11a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11a60 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62 65 67   /* Mark the beg
11a70 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 6f  inning of the to
11a80 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e 74 6f  ken */.    ps.to
11a90 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65  kenlineno = line
11aa0 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no;           /*
11ab0 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e 20 77   Linenumber on w
11ac0 68 69 63 68 20 74 6f 6b 65 6e 20 62 65 67 69 6e  hich token begin
11ad0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d  s */.    if( c==
11ae0 27 5c 22 27 20 29 7b 20 20 20 20 20 20 20 20 20  '\"' ){         
11af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
11b00 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 20 2a  tring literals *
11b10 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20  /.      cp++;.  
11b20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
11b30 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 22  cp)!=0 && c!='\"
11b40 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
11b50 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
11b60 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b  o++;.        cp+
11b70 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
11b80 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
11b90 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11ba0 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72 74 6c  .filename,startl
11bb0 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73 74 61  ine,."String sta
11bc0 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69  rting on this li
11bd0 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e  ne is not termin
11be0 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  ated before the 
11bf0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
11c00 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65  ");.        ps.e
11c10 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
11c20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
11c30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11c40 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
11c50 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
11c60 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27  }else if( c=='{'
11c70 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
11c80 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f 66 20    /* A block of 
11c90 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  C code */.      
11ca0 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20 20 20  int level;.     
11cb0 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72   cp++;.      for
11cc0 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20 2a 63  (level=1; (c= *c
11cd0 70 29 21 3d 30 20 26 26 20 28 6c 65 76 65 6c 3e  p)!=0 && (level>
11ce0 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20 63 70  1 || c!='}'); cp
11cf0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
11d00 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
11d10 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73  o++;.        els
11d20 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 20 6c  e if( c=='{' ) l
11d30 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  evel++;.        
11d40 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d 27 20  else if( c=='}' 
11d50 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20  ) level--;.     
11d60 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
11d70 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27  /' && cp[1]=='*'
11d80 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63 6f 6d   ){  /* Skip com
11d90 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
11da0 20 20 20 69 6e 74 20 70 72 65 76 63 3b 0a 20 20     int prevc;.  
11db0 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63 70          cp = &cp
11dc0 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  [2];.          p
11dd0 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
11de0 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
11df0 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f  cp)!=0 && (c!='/
11e00 27 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a 27 29  ' || prevc!='*')
11e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
11e20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
11e30 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
11e40 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 20      prevc = c;. 
11e50 20 20 20 20 20 20 20 20 20 20 20 63 70 2b 2b 3b             cp++;
11e60 0a 09 20 20 7d 0a 09 7d 65 6c 73 65 20 69 66 28  ..  }..}else if(
11e70 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
11e80 3d 3d 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='/' ){  /* Ski
11e90 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d  p C++ style comm
11ea0 65 6e 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20  ents too */.    
11eb0 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32        cp = &cp[2
11ec0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  ];.          whi
11ed0 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
11ee0 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b  && c!='\n' ) cp+
11ef0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  +;.          if(
11f00 20 63 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09   c ) lineno++;..
11f10 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27  }else if( c=='\'
11f20 27 20 7c 7c 20 63 3d 3d 27 5c 22 27 20 29 7b 20  ' || c=='\"' ){ 
11f30 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 61 20 63     /* String a c
11f40 68 61 72 61 63 74 65 72 20 6c 69 74 65 72 61 6c  haracter literal
11f50 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  s */.          i
11f60 6e 74 20 73 74 61 72 74 63 68 61 72 2c 20 70 72  nt startchar, pr
11f70 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73  evc;.          s
11f80 74 61 72 74 63 68 61 72 20 3d 20 63 3b 0a 20 20  tartchar = c;.  
11f90 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
11fa0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  0;.          for
11fb0 28 63 70 2b 2b 3b 20 28 63 3d 20 2a 63 70 29 21  (cp++; (c= *cp)!
11fc0 3d 30 20 26 26 20 28 63 21 3d 73 74 61 72 74 63  =0 && (c!=startc
11fd0 68 61 72 20 7c 7c 20 70 72 65 76 63 3d 3d 27 5c  har || prevc=='\
11fe0 5c 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  \'); cp++){.    
11ff0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
12000 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
12010 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12020 70 72 65 76 63 3d 3d 27 5c 5c 27 20 29 20 70 72  prevc=='\\' ) pr
12030 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  evc = 0;.       
12040 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20       else       
12050 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 63         prevc = c
12060 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20  ;..  }..}.      
12070 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
12080 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
12090 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65  rMsg(ps.filename
120a0 2c 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  ,ps.tokenlineno,
120b0 0a 22 43 20 63 6f 64 65 20 73 74 61 72 74 69 6e  ."C code startin
120c0 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69  g on this line i
120d0 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64  s not terminated
120e0 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20   before the end 
120f0 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a  of the file.");.
12100 20 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72          ps.error
12110 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e  cnt++;.        n
12120 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
12130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12140 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a   nextcp = cp+1;.
12150 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
12160 65 20 69 66 28 20 69 73 61 6c 6e 75 6d 28 63 29  e if( isalnum(c)
12170 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
12180 49 64 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20  Identifiers */. 
12190 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
121a0 2a 63 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c  *cp)!=0 && (isal
121b0 6e 75 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27  num(c) || c=='_'
121c0 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20  ) ) cp++;.      
121d0 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20  nextcp = cp;.   
121e0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3a   }else if( c==':
121f0 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 3a 27 20  ' && cp[1]==':' 
12200 26 26 20 63 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b  && cp[2]=='=' ){
12210 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72   /* The operator
12220 20 22 3a 3a 3d 22 20 2a 2f 0a 20 20 20 20 20 20   "::=" */.      
12230 63 70 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 6e  cp += 3;.      n
12240 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20  extcp = cp;.    
12250 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20  }else{          
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e  /* All other (on
12280 65 20 63 68 61 72 61 63 74 65 72 29 20 6f 70 65  e character) ope
12290 72 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  rators */.      
122a0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
122b0 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20  cp = cp;.    }. 
122c0 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20     c = *cp;.    
122d0 2a 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *cp = 0;        
122e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122f0 2f 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74  /* Null terminat
12300 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20  e the token */. 
12310 20 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e     parseonetoken
12320 28 26 70 73 29 3b 20 20 20 20 20 20 20 20 20 20  (&ps);          
12330 20 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20     /* Parse the 
12340 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70  token */.    *cp
12350 20 3d 20 63 3b 20 20 20 20 20 20 20 20 20 20 20   = c;           
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12370 52 65 73 74 6f 72 65 20 74 68 65 20 62 75 66 66  Restore the buff
12380 65 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e  er */.    cp = n
12390 65 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65  extcp;.  }.  fre
123a0 65 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20  e(filebuf);     
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
123c0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 62 75  * Release the bu
123d0 66 66 65 72 20 61 66 74 65 72 20 70 61 72 73 69  ffer after parsi
123e0 6e 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65  ng */.  gp->rule
123f0 20 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b   = ps.firstrule;
12400 0a 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20  .  gp->errorcnt 
12410 3d 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d  = ps.errorcnt;.}
12420 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
12430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
12440 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69  om the file "pli
12450 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  nk.c" **********
12460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
12470 2a 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63  ** Routines proc
12480 65 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61  essing configura
12490 74 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20  tion follow-set 
124a0 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
124b0 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f  s.** in the LEMO
124c0 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
124d0 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  or..*/.static st
124e0 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e  ruct plink *plin
124f0 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a  k_freelist = 0;.
12500 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
12510 65 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75  ew plink */.stru
12520 63 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f  ct plink *Plink_
12530 6e 65 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20  new(){.  struct 
12540 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69  plink *new;..  i
12550 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  f( plink_freelis
12560 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
12570 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d  i;.    int amt =
12580 20 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f   100;.    plink_
12590 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
125a0 63 74 20 70 6c 69 6e 6b 20 2a 29 6d 61 6c 6c 6f  ct plink *)mallo
125b0 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
125c0 20 70 6c 69 6e 6b 29 2a 61 6d 74 20 29 3b 0a 20   plink)*amt );. 
125d0 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65     if( plink_fre
125e0 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
125f0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
12600 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20  ,.      "Unable 
12610 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
12620 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c  ry for a new fol
12630 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74  low-set propagat
12640 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20  ion link.\n");. 
12650 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
12660 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
12670 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70   i<amt-1; i++) p
12680 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d  link_freelist[i]
12690 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66  .next = &plink_f
126a0 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20  reelist[i+1];.  
126b0 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74    plink_freelist
126c0 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30  [amt-1].next = 0
126d0 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c  ;.  }.  new = pl
126e0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20  ink_freelist;.  
126f0 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
12700 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d   plink_freelist-
12710 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
12720 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  new;.}../* Add a
12730 20 70 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e   plink to a plin
12740 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50  k list */.void P
12750 6c 69 6e 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66  link_add(plpp,cf
12760 70 29 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  p).struct plink 
12770 2a 2a 70 6c 70 70 3b 0a 73 74 72 75 63 74 20 63  **plpp;.struct c
12780 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20  onfig *cfp;.{.  
12790 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
127a0 77 3b 0a 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b  w;.  new = Plink
127b0 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e  _new();.  new->n
127c0 65 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a  ext = *plpp;.  *
127d0 70 6c 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65  plpp = new;.  ne
127e0 77 2d 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a  w->cfp = cfp;.}.
127f0 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65  ./* Transfer eve
12800 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ry plink on the 
12810 6c 69 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74  list "from" to t
12820 68 65 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a  he list "to" */.
12830 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28  void Plink_copy(
12840 74 6f 2c 66 72 6f 6d 29 0a 73 74 72 75 63 74 20  to,from).struct 
12850 70 6c 69 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75  plink **to;.stru
12860 63 74 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a  ct plink *from;.
12870 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
12880 20 2a 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c   *nextpl;.  whil
12890 65 28 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e  e( from ){.    n
128a0 65 78 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65  extpl = from->ne
128b0 78 74 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65  xt;.    from->ne
128c0 78 74 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74  xt = *to;.    *t
128d0 6f 20 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72  o = from;.    fr
128e0 6f 6d 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d  om = nextpl;.  }
128f0 0a 7d 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76  .}../* Delete ev
12900 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65  ery plink on the
12910 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c   list */.void Pl
12920 69 6e 6b 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a  ink_delete(plp).
12930 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
12940 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  p;.{.  struct pl
12950 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20  ink *nextpl;..  
12960 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
12970 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e    nextpl = plp->
12980 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e  next;.    plp->n
12990 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ext = plink_free
129a0 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f  list;.    plink_
129b0 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a  freelist = plp;.
129c0 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c      plp = nextpl
129d0 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ;.  }.}./*******
129e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129f0 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
12a00 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  report.c" ******
12a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a20 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  ****/./*.** Proc
12a30 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72  edures for gener
12a40 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e  ating reports an
12a50 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  d tables in the 
12a60 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
12a70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47  erator..*/../* G
12a80 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61  enerate a filena
12a90 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  me with the give
12aa0 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61 63 65  n suffix.  Space
12ab0 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
12ac0 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20  name comes from 
12ad0 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
12ae0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
12af0 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
12b00 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
12b10 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b  E char *file_mak
12b20 65 6e 61 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69  ename(lemp,suffi
12b30 78 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  x).struct lemon 
12b40 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66  *lemp;.char *suf
12b50 66 69 78 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e  fix;.{.  char *n
12b60 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
12b70 0a 0a 20 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f  ..  name = mallo
12b80 63 28 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e  c( strlen(lemp->
12b90 66 69 6c 65 6e 61 6d 65 29 20 2b 20 73 74 72 6c  filename) + strl
12ba0 65 6e 28 73 75 66 66 69 78 29 20 2b 20 35 20 29  en(suffix) + 5 )
12bb0 3b 0a 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20  ;.  if( name==0 
12bc0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
12bd0 74 64 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c  tderr,"Can't all
12be0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
12bf0 61 20 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b  a filename.\n");
12c00 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
12c10 7d 0a 20 20 73 74 72 63 70 79 28 6e 61 6d 65 2c  }.  strcpy(name,
12c20 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
12c30 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28  .  cp = strrchr(
12c40 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28  name,'.');.  if(
12c50 20 63 70 20 29 20 2a 63 70 20 3d 20 30 3b 0a 20   cp ) *cp = 0;. 
12c60 20 73 74 72 63 61 74 28 6e 61 6d 65 2c 73 75 66   strcat(name,suf
12c70 66 69 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  fix);.  return n
12c80 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20  ame;.}../* Open 
12c90 61 20 66 69 6c 65 20 77 69 74 68 20 61 20 6e 61  a file with a na
12ca0 6d 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  me based on the 
12cb0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  name of the inpu
12cc0 74 20 66 69 6c 65 2c 0a 2a 2a 20 62 75 74 20 77  t file,.** but w
12cd0 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
12ce0 28 73 70 65 63 69 66 69 65 64 29 20 73 75 66 66  (specified) suff
12cf0 69 78 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ix, and return a
12d00 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
12d10 68 65 20 73 74 72 65 61 6d 20 2a 2f 0a 50 52 49  he stream */.PRI
12d20 56 41 54 45 20 46 49 4c 45 20 2a 66 69 6c 65 5f  VATE FILE *file_
12d30 6f 70 65 6e 28 6c 65 6d 70 2c 73 75 66 66 69 78  open(lemp,suffix
12d40 2c 6d 6f 64 65 29 0a 73 74 72 75 63 74 20 6c 65  ,mode).struct le
12d50 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20  mon *lemp;.char 
12d60 2a 73 75 66 66 69 78 3b 0a 63 68 61 72 20 2a 6d  *suffix;.char *m
12d70 6f 64 65 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 66  ode;.{.  FILE *f
12d80 70 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  p;..  if( lemp->
12d90 6f 75 74 6e 61 6d 65 20 29 20 66 72 65 65 28 6c  outname ) free(l
12da0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20  emp->outname);. 
12db0 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d   lemp->outname =
12dc0 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c   file_makename(l
12dd0 65 6d 70 2c 20 73 75 66 66 69 78 29 3b 0a 20 20  emp, suffix);.  
12de0 66 70 20 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d  fp = fopen(lemp-
12df0 3e 6f 75 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a  >outname,mode);.
12e00 20 20 69 66 28 20 66 70 3d 3d 30 20 26 26 20 2a    if( fp==0 && *
12e10 6d 6f 64 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20  mode=='w' ){.   
12e20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
12e30 22 43 61 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65  "Can't open file
12e40 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70   \"%s\".\n",lemp
12e50 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20  ->outname);.    
12e60 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
12e70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
12e80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 70 3b    }.  return fp;
12e90 0a 7d 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65  .}../* Duplicate
12ea0 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
12eb0 77 69 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73  without comments
12ec0 20 61 6e 64 20 77 69 74 68 6f 75 74 20 61 63 74   and without act
12ed0 69 6f 6e 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65  ions .** on rule
12ee0 73 20 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e  s */.void Reprin
12ef0 74 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  t(lemp).struct l
12f00 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
12f10 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
12f20 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
12f30 20 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   *sp;.  int i, j
12f40 2c 20 6d 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e  , maxlen, len, n
12f50 63 6f 6c 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20  columns, skip;. 
12f60 20 70 72 69 6e 74 66 28 22 2f 2f 20 52 65 70 72   printf("// Repr
12f70 69 6e 74 20 6f 66 20 69 6e 70 75 74 20 66 69 6c  int of input fil
12f80 65 20 5c 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79  e \"%s\".\n// Sy
12f90 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e  mbols:\n",lemp->
12fa0 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 6d 61 78  filename);.  max
12fb0 6c 65 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28  len = 10;.  for(
12fc0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
12fd0 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
12fe0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
12ff0 6c 73 5b 69 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d  ls[i];.    len =
13000 20 73 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65   strlen(sp->name
13010 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d  );.    if( len>m
13020 61 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d  axlen ) maxlen =
13030 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c   len;.  }.  ncol
13040 75 6d 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65  umns = 76/(maxle
13050 6e 2b 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c  n+5);.  if( ncol
13060 75 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e  umns<1 ) ncolumn
13070 73 20 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20  s = 1;.  skip = 
13080 28 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b  (lemp->nsymbol +
13090 20 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e   ncolumns - 1)/n
130a0 63 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69  columns;.  for(i
130b0 3d 30 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29  =0; i<skip; i++)
130c0 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f  {.    printf("//
130d0 22 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b  ");.    for(j=i;
130e0 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   j<lemp->nsymbol
130f0 3b 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20  ; j+=skip){.    
13100 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d    sp = lemp->sym
13110 62 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61  bols[j];.      a
13120 73 73 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78  ssert( sp->index
13130 3d 3d 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69  ==j );.      pri
13140 6e 74 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73  ntf(" %3d %-*.*s
13150 22 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65  ",j,maxlen,maxle
13160 6e 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  n,sp->name);.   
13170 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c   }.    printf("\
13180 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72  n");.  }.  for(r
13190 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
131a0 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
131b0 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c      printf("%s",
131c0 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  rp->lhs->name);.
131d0 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68  /*    if( rp->lh
131e0 73 61 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28  salias ) printf(
131f0 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c  "(%s)",rp->lhsal
13200 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69  ias); */.    pri
13210 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20  ntf(" ::=");.   
13220 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
13230 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nrhs; i++){.    
13240 20 20 70 72 69 6e 74 66 28 22 20 25 73 22 2c 72    printf(" %s",r
13250 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 29  p->rhs[i]->name)
13260 3b 0a 2f 2a 20 20 20 20 20 20 69 66 28 20 72 70  ;./*      if( rp
13270 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 20  ->rhsalias[i] ) 
13280 70 72 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70  printf("(%s)",rp
13290 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20  ->rhsalias[i]); 
132a0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69  */.    }.    pri
132b0 6e 74 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66  ntf(".");.    if
132c0 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20  ( rp->precsym ) 
132d0 70 72 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72  printf(" [%s]",r
132e0 70 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65  p->precsym->name
132f0 29 3b 0a 2f 2a 20 20 20 20 69 66 28 20 72 70 2d  );./*    if( rp-
13300 3e 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22  >code ) printf("
13310 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f  \n    %s",rp->co
13320 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e  de); */.    prin
13330 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a  tf("\n");.  }.}.
13340 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50 72 69 6e  .void ConfigPrin
13350 74 28 66 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a  t(fp,cfp).FILE *
13360 66 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  fp;.struct confi
13370 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75  g *cfp;.{.  stru
13380 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69  ct rule *rp;.  i
13390 6e 74 20 69 3b 0a 20 20 72 70 20 3d 20 63 66 70  nt i;.  rp = cfp
133a0 2d 3e 72 70 3b 0a 20 20 66 70 72 69 6e 74 66 28  ->rp;.  fprintf(
133b0 66 70 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e  fp,"%s ::=",rp->
133c0 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f  lhs->name);.  fo
133d0 72 28 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72  r(i=0; i<=rp->nr
133e0 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  hs; i++){.    if
133f0 28 20 69 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 20  ( i==cfp->dot ) 
13400 66 70 72 69 6e 74 66 28 66 70 2c 22 20 2a 22 29  fprintf(fp," *")
13410 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d  ;.    if( i==rp-
13420 3e 6e 72 68 73 20 29 20 62 72 65 61 6b 3b 0a 20  >nrhs ) break;. 
13430 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
13440 25 73 22 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e  %s",rp->rhs[i]->
13450 6e 61 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  name);.  }.}../*
13460 20 23 64 65 66 69 6e 65 20 54 45 53 54 20 2a 2f   #define TEST */
13470 0a 23 69 66 64 65 66 20 54 45 53 54 0a 2f 2a 20  .#ifdef TEST./* 
13480 50 72 69 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50  Print a set */.P
13490 52 49 56 41 54 45 20 76 6f 69 64 20 53 65 74 50  RIVATE void SetP
134a0 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d  rint(out,set,lem
134b0 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68  p).FILE *out;.ch
134c0 61 72 20 2a 73 65 74 3b 0a 73 74 72 75 63 74 20  ar *set;.struct 
134d0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
134e0 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
134f0 73 70 61 63 65 72 3b 0a 20 20 73 70 61 63 65 72  spacer;.  spacer
13500 20 3d 20 22 22 3b 0a 20 20 66 70 72 69 6e 74 66   = "";.  fprintf
13510 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c 22 22 29  (out,"%12s[","")
13520 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
13530 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
13540 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 65  i++){.    if( Se
13550 74 46 69 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a  tFind(set,i) ){.
13560 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
13570 74 2c 22 25 73 25 73 22 2c 73 70 61 63 65 72 2c  t,"%s%s",spacer,
13580 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
13590 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  ->name);.      s
135a0 70 61 63 65 72 20 3d 20 22 20 22 3b 0a 20 20 20  pacer = " ";.   
135b0 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
135c0 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a  (out,"]\n");.}..
135d0 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b  /* Print a plink
135e0 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54   chain */.PRIVAT
135f0 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e  E void PlinkPrin
13600 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46  t(out,plp,tag).F
13610 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74  ILE *out;.struct
13620 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61   plink *plp;.cha
13630 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c  r *tag;.{.  whil
13640 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 66 70  e( plp ){.    fp
13650 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 25  rintf(out,"%12s%
13660 73 20 28 73 74 61 74 65 20 25 32 64 29 20 22 2c  s (state %2d) ",
13670 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d  "",tag,plp->cfp-
13680 3e 73 74 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  >stp->index);.  
13690 20 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75    ConfigPrint(ou
136a0 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20  t,plp->cfp);.   
136b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
136c0 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c  ");.    plp = pl
136d0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23  p->next;.  }.}.#
136e0 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20  endif../* Print 
136f0 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65  an action to the
13700 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
13710 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
13720 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68  FALSE if.** noth
13730 69 6e 67 20 77 61 73 20 61 63 74 75 61 6c 6c 79  ing was actually
13740 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74   printed..*/.int
13750 20 50 72 69 6e 74 41 63 74 69 6f 6e 28 73 74 72   PrintAction(str
13760 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20  uct action *ap, 
13770 46 49 4c 45 20 2a 66 70 2c 20 69 6e 74 20 69 6e  FILE *fp, int in
13780 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 65 73  dent){.  int res
13790 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77 69 74 63  ult = 1;.  switc
137a0 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20  h( ap->type ){. 
137b0 20 20 20 63 61 73 65 20 53 48 49 46 54 3a 0a 20     case SHIFT:. 
137c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
137d0 22 25 2a 73 20 73 68 69 66 74 20 20 25 64 22 2c  "%*s shift  %d",
137e0 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
137f0 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 69  ame,ap->x.stp->i
13800 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  ndex);.      bre
13810 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44  ak;.    case RED
13820 55 43 45 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  UCE:.      fprin
13830 74 66 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63  tf(fp,"%*s reduc
13840 65 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  e %d",indent,ap-
13850 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e  >sp->name,ap->x.
13860 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  rp->index);.    
13870 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13880 65 20 41 43 43 45 50 54 3a 0a 20 20 20 20 20 20  e ACCEPT:.      
13890 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
138a0 61 63 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61  accept",indent,a
138b0 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  p->sp->name);.  
138c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
138d0 61 73 65 20 45 52 52 4f 52 3a 0a 20 20 20 20 20  ase ERROR:.     
138e0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
138f0 20 65 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61   error",indent,a
13900 70 2d 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  p->sp->name);.  
13910 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
13920 61 73 65 20 43 4f 4e 46 4c 49 43 54 3a 0a 20 20  ase CONFLICT:.  
13930 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
13940 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64 20  %*s reduce %-3d 
13950 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c  ** Parsing confl
13960 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20  ict **",.       
13970 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
13980 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69  name,ap->x.rp->i
13990 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  ndex);.      bre
139a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f  ak;.    case SH_
139b0 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61  RESOLVED:.    ca
139c0 73 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a  se RD_RESOLVED:.
139d0 20 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45      case NOT_USE
139e0 44 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20  D:.      result 
139f0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
13a00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
13a10 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  esult;.}../* Gen
13a20 65 72 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74  erate the "y.out
13a30 70 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f  put" log file */
13a40 0a 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70  .void ReportOutp
13a50 75 74 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  ut(lemp).struct 
13a60 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
13a70 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
13a80 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
13a90 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
13aa0 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
13ab0 6f 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a  on *ap;.  FILE *
13ac0 66 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65  fp;..  fp = file
13ad0 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74  _open(lemp,".out
13ae0 22 2c 22 77 22 29 3b 0a 20 20 69 66 28 20 66 70  ","w");.  if( fp
13af0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
13b00 66 70 72 69 6e 74 66 28 66 70 2c 22 20 5c 62 22  fprintf(fp," \b"
13b10 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
13b20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
13b30 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
13b40 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
13b50 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 53     fprintf(fp,"S
13b60 74 61 74 65 20 25 64 3a 5c 6e 22 2c 73 74 70 2d  tate %d:\n",stp-
13b70 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  >index);.    if(
13b80 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67   lemp->basisflag
13b90 20 29 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a   ) cfp=stp->bp;.
13ba0 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
13bb0 20 20 20 20 20 20 20 20 20 20 63 66 70 3d 73 74            cfp=st
13bc0 70 2d 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c  p->cfp;.    whil
13bd0 65 28 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20  e( cfp ){.      
13be0 63 68 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20  char buf[20];.  
13bf0 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74      if( cfp->dot
13c00 3d 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20  ==cfp->rp->nrhs 
13c10 29 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e  ){.        sprin
13c20 74 66 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66  tf(buf,"(%d)",cf
13c30 70 2d 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  p->rp->index);. 
13c40 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
13c50 70 2c 22 20 20 20 20 25 35 73 20 22 2c 62 75 66  p,"    %5s ",buf
13c60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13c70 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
13c80 66 70 2c 22 20 20 20 20 20 20 20 20 20 20 22 29  fp,"          ")
13c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ca0 43 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63  ConfigPrint(fp,c
13cb0 66 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  fp);.      fprin
13cc0 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66  tf(fp,"\n");.#if
13cd0 64 65 66 20 54 45 53 54 0a 20 20 20 20 20 20 53  def TEST.      S
13ce0 65 74 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e  etPrint(fp,cfp->
13cf0 66 77 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20  fws,lemp);.     
13d00 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63   PlinkPrint(fp,c
13d10 66 70 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29  fp->fplp,"To  ")
13d20 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69  ;.      PlinkPri
13d30 6e 74 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c  nt(fp,cfp->bplp,
13d40 22 46 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a  "From");.#endif.
13d50 20 20 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e        if( lemp->
13d60 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d  basisflag ) cfp=
13d70 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65  cfp->bp;.      e
13d80 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
13d90 20 20 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65       cfp=cfp->ne
13da0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  xt;.    }.    fp
13db0 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a  rintf(fp,"\n");.
13dc0 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
13dd0 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
13de0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
13df0 50 72 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66  PrintAction(ap,f
13e00 70 2c 33 30 29 20 29 20 66 70 72 69 6e 74 66 28  p,30) ) fprintf(
13e10 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a  fp,"\n");.    }.
13e20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
13e30 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f  \n");.  }.  fclo
13e40 73 65 28 66 70 29 3b 0a 20 20 72 65 74 75 72 6e  se(fp);.  return
13e50 3b 0a 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66  ;.}../* Search f
13e60 6f 72 20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d  or the file "nam
13e70 65 22 20 77 68 69 63 68 20 69 73 20 69 6e 20 74  e" which is in t
13e80 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
13e90 79 20 61 73 0a 2a 2a 20 74 68 65 20 65 78 61 63  y as.** the exac
13ea0 75 74 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54  utable */.PRIVAT
13eb0 45 20 63 68 61 72 20 2a 70 61 74 68 73 65 61 72  E char *pathsear
13ec0 63 68 28 61 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f  ch(argv0,name,mo
13ed0 64 65 6d 61 73 6b 29 0a 63 68 61 72 20 2a 61 72  demask).char *ar
13ee0 67 76 30 3b 0a 63 68 61 72 20 2a 6e 61 6d 65 3b  gv0;.char *name;
13ef0 0a 69 6e 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b  .int modemask;.{
13f00 0a 20 20 63 68 61 72 20 2a 70 61 74 68 6c 69 73  .  char *pathlis
13f10 74 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 2c  t;.  char *path,
13f20 2a 63 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  *cp;.  char c;. 
13f30 20 65 78 74 65 72 6e 20 69 6e 74 20 61 63 63 65   extern int acce
13f40 73 73 28 29 3b 0a 0a 23 69 66 64 65 66 20 5f 5f  ss();..#ifdef __
13f50 57 49 4e 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73  WIN32__.  cp = s
13f60 74 72 72 63 68 72 28 61 72 67 76 30 2c 27 5c 5c  trrchr(argv0,'\\
13f70 27 29 3b 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d  ');.#else.  cp =
13f80 20 73 74 72 72 63 68 72 28 61 72 67 76 30 2c 27   strrchr(argv0,'
13f90 2f 27 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  /');.#endif.  if
13fa0 28 20 63 70 20 29 7b 0a 20 20 20 20 63 20 3d 20  ( cp ){.    c = 
13fb0 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30  *cp;.    *cp = 0
13fc0 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68  ;.    path = (ch
13fd0 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72  ar *)malloc( str
13fe0 6c 65 6e 28 61 72 67 76 30 29 20 2b 20 73 74 72  len(argv0) + str
13ff0 6c 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b  len(name) + 2 );
14000 0a 20 20 20 20 69 66 28 20 70 61 74 68 20 29 20  .    if( path ) 
14010 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73  sprintf(path,"%s
14020 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29  /%s",argv0,name)
14030 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20  ;.    *cp = c;. 
14040 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 74 65   }else{.    exte
14050 72 6e 20 63 68 61 72 20 2a 67 65 74 65 6e 76 28  rn char *getenv(
14060 29 3b 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20  );.    pathlist 
14070 3d 20 67 65 74 65 6e 76 28 22 50 41 54 48 22 29  = getenv("PATH")
14080 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c 69  ;.    if( pathli
14090 73 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74  st==0 ) pathlist
140a0 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f   = ".:/bin:/usr/
140b0 62 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 20 3d  bin";.    path =
140c0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
140d0 20 73 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74   strlen(pathlist
140e0 29 2b 73 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32  )+strlen(name)+2
140f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68   );.    if( path
14100 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69  !=0 ){.      whi
14110 6c 65 28 20 2a 70 61 74 68 6c 69 73 74 20 29 7b  le( *pathlist ){
14120 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20 73 74  .        cp = st
14130 72 63 68 72 28 70 61 74 68 6c 69 73 74 2c 27 3a  rchr(pathlist,':
14140 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ');.        if( 
14150 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 26 70 61  cp==0 ) cp = &pa
14160 74 68 6c 69 73 74 5b 73 74 72 6c 65 6e 28 70 61  thlist[strlen(pa
14170 74 68 6c 69 73 74 29 5d 3b 0a 20 20 20 20 20 20  thlist)];.      
14180 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20    c = *cp;.     
14190 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20     *cp = 0;.    
141a0 20 20 20 20 73 70 72 69 6e 74 66 28 70 61 74 68      sprintf(path
141b0 2c 22 25 73 2f 25 73 22 2c 70 61 74 68 6c 69 73  ,"%s/%s",pathlis
141c0 74 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  t,name);.       
141d0 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20 20 20   *cp = c;.      
141e0 20 20 69 66 28 20 63 3d 3d 30 20 29 20 70 61 74    if( c==0 ) pat
141f0 68 6c 69 73 74 20 3d 20 22 22 3b 0a 20 20 20 20  hlist = "";.    
14200 20 20 20 20 65 6c 73 65 20 70 61 74 68 6c 69 73      else pathlis
14210 74 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20  t = &cp[1];.    
14220 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28 70      if( access(p
14230 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30  ath,modemask)==0
14240 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
14250 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
14260 74 75 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a  turn path;.}../*
14270 20 47 69 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e   Given an action
14280 2c 20 63 6f 6d 70 75 74 65 20 74 68 65 20 69 6e  , compute the in
14290 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
142a0 74 68 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77  that action.** w
142b0 68 69 63 68 20 69 73 20 74 6f 20 62 65 20 70 75  hich is to be pu
142c0 74 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20  t in the action 
142d0 74 61 62 6c 65 20 6f 66 20 74 68 65 20 67 65 6e  table of the gen
142e0 65 72 61 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a  erated machine..
142f0 2a 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  ** Return negati
14300 76 65 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20  ve if no action 
14310 73 68 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61  should be genera
14320 74 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ted..*/.PRIVATE 
14330 69 6e 74 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  int compute_acti
14340 6f 6e 28 6c 65 6d 70 2c 61 70 29 0a 73 74 72 75  on(lemp,ap).stru
14350 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
14360 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
14370 70 3b 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a  p;.{.  int act;.
14380 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79    switch( ap->ty
14390 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  pe ){.    case S
143a0 48 49 46 54 3a 20 20 61 63 74 20 3d 20 61 70 2d  HIFT:  act = ap-
143b0 3e 78 2e 73 74 70 2d 3e 69 6e 64 65 78 3b 20 20  >x.stp->index;  
143c0 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
143d0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44  ak;.    case RED
143e0 55 43 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78  UCE: act = ap->x
143f0 2e 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d  .rp->index + lem
14400 70 2d 3e 6e 73 74 61 74 65 3b 20 62 72 65 61 6b  p->nstate; break
14410 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52  ;.    case ERROR
14420 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e  :  act = lemp->n
14430 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72  state + lemp->nr
14440 75 6c 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ule;     break;.
14450 20 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a      case ACCEPT:
14460 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74   act = lemp->nst
14470 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
14480 65 20 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20  e + 1; break;.  
14490 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61    default:     a
144a0 63 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a  ct = -1; break;.
144b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74    }.  return act
144c0 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e  ;.}..#define LIN
144d0 45 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68  ESIZE 1000./* Th
144e0 65 20 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f  e next cluster o
144f0 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66  f routines are f
14500 6f 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74  or reading the t
14510 65 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20  emplate file.** 
14520 61 6e 64 20 77 72 69 74 69 6e 67 20 74 68 65 20  and writing the 
14530 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67  results to the g
14540 65 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20  enerated parser 
14550 2a 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20  */./* The first 
14560 66 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65  function transfe
14570 72 73 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e  rs data from "in
14580 22 20 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c  " to "out" until
14590 0a 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65  .** a line is se
145a0 65 6e 20 77 68 69 63 68 20 62 65 67 69 6e 73 20  en which begins 
145b0 77 69 74 68 20 22 25 25 22 2e 20 20 54 68 65 20  with "%%".  The 
145c0 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  line number is.*
145d0 2a 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a  * tracked..**.**
145e0 20 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65   if name!=0, the
145f0 6e 20 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20  n any word that 
14600 62 65 67 69 6e 20 77 69 74 68 20 22 50 61 72 73  begin with "Pars
14610 65 22 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  e" is changed to
14620 0a 2a 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a  .** begin with *
14630 6e 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f  name instead..*/
14640 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70  .PRIVATE void tp
14650 6c 74 5f 78 66 65 72 28 6e 61 6d 65 2c 69 6e 2c  lt_xfer(name,in,
14660 6f 75 74 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61 72  out,lineno).char
14670 20 2a 6e 61 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e   *name;.FILE *in
14680 3b 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74  ;.FILE *out;.int
14690 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e   *lineno;.{.  in
146a0 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63  t i, iStart;.  c
146b0 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
146c0 45 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65  E];.  while( fge
146d0 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45  ts(line,LINESIZE
146e0 2c 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d  ,in) && (line[0]
146f0 21 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d  !='%' || line[1]
14700 21 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a  !='%') ){.    (*
14710 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69  lineno)++;.    i
14720 53 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69  Start = 0;.    i
14730 66 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  f( name ){.     
14740 20 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69   for(i=0; line[i
14750 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
14760 20 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50   if( line[i]=='P
14770 27 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69  ' && strncmp(&li
14780 6e 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29  ne[i],"Parse",5)
14790 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
147a0 20 28 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70   (i==0 || !isalp
147b0 68 61 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20  ha(line[i-1])). 
147c0 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
147d0 20 20 20 20 69 66 28 20 69 3e 69 53 74 61 72 74      if( i>iStart
147e0 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
147f0 25 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26  %.*s",i-iStart,&
14800 6c 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20  line[iStart]);. 
14810 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
14820 28 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b  (out,"%s",name);
14830 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
14840 34 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 74  4;.          iSt
14850 61 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20  art = i+1;.     
14860 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14870 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
14880 75 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53  ut,"%s",&line[iS
14890 74 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  tart]);.  }.}../
148a0 2a 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74  * The next funct
148b0 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65  ion finds the te
148c0 6d 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20  mplate file and 
148d0 6f 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e  opens it, return
148e0 69 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  ing.** a pointer
148f0 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
14900 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20  ile. */.PRIVATE 
14910 46 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28  FILE *tplt_open(
14920 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
14930 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74  on *lemp;.{.  st
14940 61 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61  atic char templa
14950 74 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70  tename[] = "lemp
14960 61 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75  ar.c";.  char bu
14970 66 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20  f[1000];.  FILE 
14980 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c  *in;.  char *tpl
14990 74 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63  tname;.  char *c
149a0 70 3b 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63  p;..  cp = strrc
149b0 68 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  hr(lemp->filenam
149c0 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70  e,'.');.  if( cp
149d0 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28   ){.    sprintf(
149e0 62 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69  buf,"%.*s.lt",(i
149f0 6e 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c  nt)(cp-lemp->fil
14a00 65 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c  ename),lemp->fil
14a10 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ename);.  }else{
14a20 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66  .    sprintf(buf
14a30 2c 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66  ,"%s.lt",lemp->f
14a40 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ilename);.  }.  
14a50 69 66 28 20 61 63 63 65 73 73 28 62 75 66 2c 30  if( access(buf,0
14a60 30 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70  04)==0 ){.    tp
14a70 6c 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20  ltname = buf;.  
14a80 7d 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73  }else if( access
14a90 28 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30  (templatename,00
14aa0 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c  4)==0 ){.    tpl
14ab0 74 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65  tname = template
14ac0 6e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  name;.  }else{. 
14ad0 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61     tpltname = pa
14ae0 74 68 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61  thsearch(lemp->a
14af0 72 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d  rgv0,templatenam
14b00 65 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  e,0);.  }.  if( 
14b10 74 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  tpltname==0 ){. 
14b20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
14b30 72 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68  r,"Can't find th
14b40 65 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20  e parser driver 
14b50 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22  template file \"
14b60 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65  %s\".\n",.    te
14b70 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20  mplatename);.   
14b80 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
14b90 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  +;.    return 0;
14ba0 0a 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65  .  }.  in = fope
14bb0 6e 28 74 70 6c 74 6e 61 6d 65 2c 22 72 22 29 3b  n(tpltname,"r");
14bc0 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
14bd0 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
14be0 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
14bf0 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
14c00 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70   \"%s\".\n",temp
14c10 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
14c20 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
14c30 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
14c40 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a   }.  return in;.
14c50 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74  }../* Print a st
14c60 72 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65  ring to the file
14c70 20 61 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69   and keep the li
14c80 6e 65 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64  nenumber up to d
14c90 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ate */.PRIVATE v
14ca0 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  oid tplt_print(o
14cb0 75 74 2c 6c 65 6d 70 2c 73 74 72 2c 73 74 72 6c  ut,lemp,str,strl
14cc0 6e 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a  n,lineno).FILE *
14cd0 6f 75 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  out;.struct lemo
14ce0 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73  n *lemp;.char *s
14cf0 74 72 3b 0a 69 6e 74 20 73 74 72 6c 6e 3b 0a 69  tr;.int strln;.i
14d00 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20  nt *lineno;.{.  
14d10 69 66 28 20 73 74 72 3d 3d 30 20 29 20 72 65 74  if( str==0 ) ret
14d20 75 72 6e 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  urn;.  fprintf(o
14d30 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25  ut,"#line %d \"%
14d40 73 5c 22 5c 6e 22 2c 73 74 72 6c 6e 2c 6c 65 6d  s\"\n",strln,lem
14d50 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 28 2a  p->filename); (*
14d60 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 77 68 69  lineno)++;.  whi
14d70 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20 20 20 20  le( *str ){.    
14d80 69 66 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29  if( *str=='\n' )
14d90 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
14da0 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29    putc(*str,out)
14db0 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20 7d  ;.    str++;.  }
14dc0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
14dd0 5c 6e 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c  \n#line %d \"%s\
14de0 22 5c 6e 22 2c 2a 6c 69 6e 65 6e 6f 2b 32 2c 6c  "\n",*lineno+2,l
14df0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 28  emp->outname); (
14e00 2a 6c 69 6e 65 6e 6f 29 2b 3d 32 3b 0a 20 20 72  *lineno)+=2;.  r
14e10 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
14e20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
14e30 75 74 69 6e 65 20 65 6d 69 74 73 20 63 6f 64 65  utine emits code
14e40 20 66 6f 72 20 74 68 65 20 64 65 73 74 72 75 63   for the destruc
14e50 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  tor for the.** s
14e60 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64  ymbol sp.*/.void
14e70 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72   emit_destructor
14e80 5f 63 6f 64 65 28 6f 75 74 2c 73 70 2c 6c 65 6d  _code(out,sp,lem
14e90 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a  p,lineno).FILE *
14ea0 6f 75 74 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  out;.struct symb
14eb0 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c  ol *sp;.struct l
14ec0 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20  emon *lemp;.int 
14ed0 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72  *lineno;.{. char
14ee0 20 2a 63 70 3b 0a 0a 20 69 6e 74 20 6c 69 6e 65   *cp;.. int line
14ef0 63 6e 74 20 3d 20 30 3b 0a 20 69 66 28 20 73 70  cnt = 0;. if( sp
14f00 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
14f10 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70   ){.   cp = lemp
14f20 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20  ->tokendest;.   
14f30 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75  if( cp==0 ) retu
14f40 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  rn;.   fprintf(o
14f50 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25  ut,"#line %d \"%
14f60 73 5c 22 5c 6e 7b 22 2c 6c 65 6d 70 2d 3e 74 6f  s\"\n{",lemp->to
14f70 6b 65 6e 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e  kendestln,lemp->
14f80 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d 65 6c 73  filename);. }els
14f90 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74 72 75  e if( sp->destru
14fa0 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d 20  ctor ){.   cp = 
14fb0 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a  sp->destructor;.
14fc0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
14fd0 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
14fe0 6e 7b 22 2c 73 70 2d 3e 64 65 73 74 72 75 63 74  n{",sp->destruct
14ff0 6f 72 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  orln,lemp->filen
15000 61 6d 65 29 3b 0a 20 7d 65 6c 73 65 20 69 66 28  ame);. }else if(
15010 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29   lemp->vardest )
15020 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  {.   cp = lemp->
15030 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20  vardest;.   if( 
15040 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
15050 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
15060 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
15070 6e 7b 22 2c 6c 65 6d 70 2d 3e 76 61 72 64 65 73  n{",lemp->vardes
15080 74 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  tln,lemp->filena
15090 6d 65 29 3b 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a  me);. }. for(; *
150a0 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66  cp; cp++){.   if
150b0 28 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70  ( *cp=='$' && cp
150c0 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20  [1]=='$' ){.    
150d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79   fprintf(out,"(y
150e0 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c  ypminor->yy%d)",
150f0 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20  sp->dtnum);.    
15100 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74   cp++;.     cont
15110 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66  inue;.   }.   if
15120 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69  ( *cp=='\n' ) li
15130 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 66 70 75 74  necnt++;.   fput
15140 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20  c(*cp,out);. }. 
15150 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b  (*lineno) += 3 +
15160 20 6c 69 6e 65 63 6e 74 3b 0a 20 66 70 72 69 6e   linecnt;. fprin
15170 74 66 28 6f 75 74 2c 22 7d 5c 6e 23 6c 69 6e 65  tf(out,"}\n#line
15180 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 2a 6c   %d \"%s\"\n",*l
15190 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e  ineno,lemp->outn
151a0 61 6d 65 29 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d  ame);. return;.}
151b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
151c0 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  RUE (non-zero) i
151d0 66 20 74 68 65 20 67 69 76 65 6e 20 73 79 6d 62  f the given symb
151e0 6f 6c 20 68 61 73 20 61 20 64 65 73 74 72 75 63  ol has a destruc
151f0 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f  tor..*/.int has_
15200 64 65 73 74 72 75 63 74 6f 72 28 73 70 2c 20 6c  destructor(sp, l
15210 65 6d 70 29 0a 73 74 72 75 63 74 20 73 79 6d 62  emp).struct symb
15220 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c  ol *sp;.struct l
15230 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
15240 69 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20 73  int ret;.  if( s
15250 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
15260 4c 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c  L ){.    ret = l
15270 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d  emp->tokendest!=
15280 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
15290 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64  ret = lemp->vard
152a0 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64 65  est!=0 || sp->de
152b0 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20 7d  structor!=0;.  }
152c0 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
152d0 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74  ../* .** Generat
152e0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
152f0 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 72  cutes when the r
15300 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64 75  ule "rp" is redu
15310 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74  ced.  Write.** t
15320 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22  he code to "out"
15330 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e  .  Make sure lin
15340 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d  eno stays up-to-
15350 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  date..*/.PRIVATE
15360 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28   void emit_code(
15370 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e 65  out,rp,lemp,line
15380 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73  no).FILE *out;.s
15390 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
153a0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
153b0 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b  mp;.int *lineno;
153c0 0a 7b 0a 20 63 68 61 72 20 2a 63 70 2c 20 2a 78  .{. char *cp, *x
153d0 70 3b 0a 20 69 6e 74 20 6c 69 6e 65 63 6e 74 20  p;. int linecnt 
153e0 3d 20 30 3b 0a 20 69 6e 74 20 69 3b 0a 20 63 68  = 0;. int i;. ch
153f0 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20  ar lhsused = 0; 
15400 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
15410 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61  e LHS element ha
15420 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
15430 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53  char used[MAXRHS
15440 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72  ];   /* True for
15450 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e   each RHS elemen
15460 74 20 77 68 69 63 68 20 69 73 20 75 73 65 64 20  t which is used 
15470 2a 2f 0a 0a 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.. for(i=0; i<
15480 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75  rp->nrhs; i++) u
15490 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 6c 68 73  sed[i] = 0;. lhs
154a0 75 73 65 64 20 3d 20 30 3b 0a 0a 20 2f 2a 20 47  used = 0;.. /* G
154b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
154c0 64 6f 20 74 68 65 20 72 65 64 75 63 65 20 61 63  do the reduce ac
154d0 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d  tion */. if( rp-
154e0 3e 63 6f 64 65 20 29 7b 0a 20 20 20 66 70 72 69  >code ){.   fpri
154f0 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25  ntf(out,"#line %
15500 64 20 5c 22 25 73 5c 22 5c 6e 7b 22 2c 72 70 2d  d \"%s\"\n{",rp-
15510 3e 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65  >line,lemp->file
15520 6e 61 6d 65 29 3b 0a 20 20 20 66 6f 72 28 63 70  name);.   for(cp
15530 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20  =rp->code; *cp; 
15540 63 70 2b 2b 29 7b 0a 20 20 20 20 20 69 66 28 20  cp++){.     if( 
15550 69 73 61 6c 70 68 61 28 2a 63 70 29 20 26 26 20  isalpha(*cp) && 
15560 28 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c  (cp==rp->code ||
15570 20 28 21 69 73 61 6c 6e 75 6d 28 63 70 5b 2d 31   (!isalnum(cp[-1
15580 5d 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f  ]) && cp[-1]!='_
15590 27 29 29 20 29 7b 0a 20 20 20 20 20 20 20 63 68  ')) ){.       ch
155a0 61 72 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20  ar saved;.      
155b0 20 66 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b   for(xp= &cp[1];
155c0 20 69 73 61 6c 6e 75 6d 28 2a 78 70 29 20 7c 7c   isalnum(*xp) ||
155d0 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29   *xp=='_'; xp++)
155e0 3b 0a 20 20 20 20 20 20 20 73 61 76 65 64 20 3d  ;.       saved =
155f0 20 2a 78 70 3b 0a 20 20 20 20 20 20 20 2a 78 70   *xp;.       *xp
15600 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 69 66 28   = 0;.       if(
15610 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26   rp->lhsalias &&
15620 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c   strcmp(cp,rp->l
15630 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20  hsalias)==0 ){. 
15640 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15650 6f 75 74 2c 22 79 79 67 6f 74 6f 6d 69 6e 6f 72  out,"yygotominor
15660 2e 79 79 25 64 22 2c 72 70 2d 3e 6c 68 73 2d 3e  .yy%d",rp->lhs->
15670 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  dtnum);.        
15680 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20   cp = xp;.      
15690 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a     lhsused = 1;.
156a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
156b0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
156c0 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
156d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 69 66 28  {.           if(
156e0 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
156f0 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
15700 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d  ->rhsalias[i])==
15710 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
15720 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 79    fprintf(out,"y
15730 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79  ymsp[%d].minor.y
15740 79 25 64 22 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b  y%d",i-rp->nrhs+
15750 31 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 64 74  1,rp->rhs[i]->dt
15760 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  num);.          
15770 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20     cp = xp;.    
15780 20 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d           used[i]
15790 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
157a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
157b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
157c0 7d 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  }.       }.     
157d0 20 20 2a 78 70 20 3d 20 73 61 76 65 64 3b 0a 20    *xp = saved;. 
157e0 20 20 20 20 7d 0a 20 20 20 20 20 69 66 28 20 2a      }.     if( *
157f0 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 63  cp=='\n' ) linec
15800 6e 74 2b 2b 3b 0a 20 20 20 20 20 66 70 75 74 63  nt++;.     fputc
15810 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 20 20 7d 20  (*cp,out);.   } 
15820 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 20  /* End loop */. 
15830 20 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33    (*lineno) += 3
15840 20 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20 20 20 66   + linecnt;.   f
15850 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 23  printf(out,"}\n#
15860 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e  line %d \"%s\"\n
15870 22 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e  ",*lineno,lemp->
15880 6f 75 74 6e 61 6d 65 29 3b 0a 20 7d 20 2f 2a 20  outname);. } /* 
15890 45 6e 64 20 69 66 28 20 72 70 2d 3e 63 6f 64 65  End if( rp->code
158a0 20 29 20 2a 2f 0a 0a 20 2f 2a 20 43 68 65 63 6b   ) */.. /* Check
158b0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
158c0 65 20 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75  e LHS has been u
158d0 73 65 64 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e  sed */. if( rp->
158e0 6c 68 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73  lhsalias && !lhs
158f0 75 73 65 64 20 29 7b 0a 20 20 20 45 72 72 6f 72  used ){.   Error
15900 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
15910 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c  me,rp->ruleline,
15920 0a 20 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25  .     "Label \"%
15930 73 5c 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29  s\" for \"%s(%s)
15940 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  \" is never used
15950 2e 22 2c 0a 20 20 20 20 20 20 20 72 70 2d 3e 6c  .",.       rp->l
15960 68 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d  hsalias,rp->lhs-
15970 3e 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69  >name,rp->lhsali
15980 61 73 29 3b 0a 20 20 20 6c 65 6d 70 2d 3e 65 72  as);.   lemp->er
15990 72 6f 72 63 6e 74 2b 2b 3b 0a 20 7d 0a 0a 20 2f  rorcnt++;. }.. /
159a0 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73 74 72  * Generate destr
159b0 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52  uctor code for R
159c0 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68  HS symbols which
159d0 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
159e0 20 74 68 65 0a 20 2a 2a 20 72 65 64 75 63 65 20   the. ** reduce 
159f0 63 6f 64 65 20 2a 2f 0a 20 66 6f 72 28 69 3d 30  code */. for(i=0
15a00 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
15a10 2b 29 7b 0a 20 20 20 69 66 28 20 72 70 2d 3e 72  +){.   if( rp->r
15a20 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 21 75  hsalias[i] && !u
15a30 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 45  sed[i] ){.     E
15a40 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
15a50 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
15a60 69 6e 65 2c 0a 20 20 20 20 20 20 20 22 4c 61 62  ine,.       "Lab
15a70 65 6c 20 25 73 20 66 6f 72 20 5c 22 25 73 28 25  el %s for \"%s(%
15a80 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73  s)\" is never us
15a90 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 72 70 2d  ed.",.       rp-
15aa0 3e 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d  >rhsalias[i],rp-
15ab0 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70  >rhs[i]->name,rp
15ac0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a  ->rhsalias[i]);.
15ad0 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
15ae0 63 6e 74 2b 2b 3b 0a 20 20 20 7d 65 6c 73 65 20  cnt++;.   }else 
15af0 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73  if( rp->rhsalias
15b00 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 69  [i]==0 ){.     i
15b10 66 28 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f  f( has_destructo
15b20 72 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d  r(rp->rhs[i],lem
15b30 70 29 20 29 7b 0a 20 20 20 20 20 20 20 66 70 72  p) ){.       fpr
15b40 69 6e 74 66 28 6f 75 74 2c 22 20 20 79 79 5f 64  intf(out,"  yy_d
15b50 65 73 74 72 75 63 74 6f 72 28 25 64 2c 26 79 79  estructor(%d,&yy
15b60 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c  msp[%d].minor);\
15b70 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 72 70  n",.          rp
15b80 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c  ->rhs[i]->index,
15b90 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29 3b 20 28  i-rp->nrhs+1); (
15ba0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
15bb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 66   }else{.       f
15bc0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
15bd0 20 20 20 20 2f 2a 20 4e 6f 20 64 65 73 74 72 75      /* No destru
15be0 63 74 6f 72 20 64 65 66 69 6e 65 64 20 66 6f 72  ctor defined for
15bf0 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
15c00 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e     rp->rhs[i]->n
15c10 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 28 2a  ame);.        (*
15c20 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  lineno)++;.     
15c30 7d 0a 20 20 20 7d 0a 20 7d 0a 20 72 65 74 75 72  }.   }. }. retur
15c40 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  n;.}../*.** Prin
15c50 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  t the definition
15c60 20 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75 73   of the union us
15c70 65 64 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  ed for the parse
15c80 72 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e 0a  r's data stack..
15c90 2a 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f  ** This union co
15ca0 6e 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66 6f  ntains fields fo
15cb0 72 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65  r every possible
15cc0 20 64 61 74 61 20 74 79 70 65 20 66 6f 72 20 74   data type for t
15cd0 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e  okens.** and non
15ce0 74 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74  terminals.  In t
15cf0 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63 6f  he process of co
15d00 6d 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69 6e  mputing and prin
15d10 74 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69  ting this.** uni
15d20 6f 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68 65  on, also set the
15d30 20 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20   ".dtnum" field 
15d40 6f 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e 61  of every termina
15d50 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61  l and nontermina
15d60 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a  l.** symbol..*/.
15d70 76 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63 6b  void print_stack
15d80 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c  _union(out,lemp,
15d90 70 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 0a  plineno,mhflag).
15da0 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20  FILE *out;      
15db0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15dc0 68 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d  he output stream
15dd0 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e   */.struct lemon
15de0 20 2a 6c 65 6d 70 3b 20 20 20 20 20 20 20 20 20   *lemp;         
15df0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f  /* The main info
15e00 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
15e10 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 69 6e  his parser */.in
15e20 74 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 20  t *plineno;     
15e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
15e40 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e 65  nter to the line
15e50 20 6e 75 6d 62 65 72 20 2a 2f 0a 69 6e 74 20 6d   number */.int m
15e60 68 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20  hflag;          
15e70 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
15e80 66 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b  f generating mak
15e90 65 68 65 61 64 65 72 73 20 6f 75 74 70 75 74 20  eheaders output 
15ea0 2a 2f 0a 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  */.{.  int linen
15eb0 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20  o = *plineno;   
15ec0 20 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d   /* The line num
15ed0 62 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75  ber of the outpu
15ee0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79  t */.  char **ty
15ef0 70 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  pes;            
15f00 20 2f 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65   /* A hash table
15f10 20 6f 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f   of datatypes */
15f20 0a 20 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65  .  int arraysize
15f30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15f40 53 69 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70  Size of the "typ
15f50 65 73 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  es" array */.  i
15f60 6e 74 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20  nt maxdtlength; 
15f70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
15f80 6d 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e  mum length of an
15f90 79 20 22 2e 64 61 74 61 74 79 70 65 22 20 66 69  y ".datatype" fi
15fa0 65 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  eld. */.  char *
15fb0 73 74 64 64 74 3b 20 20 20 20 20 20 20 20 20 20  stddt;          
15fc0 20 20 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69      /* Standardi
15fd0 7a 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64  zed name for a d
15fe0 61 74 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74  atatype */.  int
15ff0 20 69 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20   i,j;           
16000 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
16010 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
16020 20 68 61 73 68 3b 20 20 20 20 20 20 20 20 20 20   hash;          
16030 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61         /* For ha
16040 73 68 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  shing the name o
16050 66 20 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68  f a type */.  ch
16060 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
16070 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
16080 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  of the parser */
16090 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
160a0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
160b0 79 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63  ypes[] and alloc
160c0 61 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20  ate stddt[] */. 
160d0 20 61 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d   arraysize = lem
160e0 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a  p->nsymbol * 2;.
160f0 20 20 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a    types = (char*
16100 2a 29 6d 61 6c 6c 6f 63 28 20 61 72 72 61 79 73  *)malloc( arrays
16110 69 7a 65 20 2a 20 73 69 7a 65 6f 66 28 63 68 61  ize * sizeof(cha
16120 72 2a 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  r*) );.  for(i=0
16130 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69  ; i<arraysize; i
16140 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30  ++) types[i] = 0
16150 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  ;.  maxdtlength 
16160 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  = 0;.  if( lemp-
16170 3e 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20  >vartype ){.    
16180 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 73 74  maxdtlength = st
16190 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79  rlen(lemp->varty
161a0 70 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  pe);.  }.  for(i
161b0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
161c0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  bol; i++){.    i
161d0 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75  nt len;.    stru
161e0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
161f0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
16200 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64 61  ;.    if( sp->da
16210 74 61 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74  tatype==0 ) cont
16220 69 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  inue;.    len = 
16230 73 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74  strlen(sp->datat
16240 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65  ype);.    if( le
16250 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29 20  n>maxdtlength ) 
16260 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65  maxdtlength = le
16270 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20 3d  n;.  }.  stddt =
16280 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20   (char*)malloc( 
16290 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20  maxdtlength*2 + 
162a0 31 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73  1 );.  if( types
162b0 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30 20  ==0 || stddt==0 
162c0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
162d0 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
162e0 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  mory.\n");.    e
162f0 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  xit(1);.  }..  /
16300 2a 20 42 75 69 6c 64 20 61 20 68 61 73 68 20 74  * Build a hash t
16310 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65  able of datatype
16320 73 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20  s. The ".dtnum" 
16330 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79  field of each sy
16340 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c  mbol.  ** is fil
16350 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 20  led in with the 
16360 68 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20  hash index plus 
16370 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76  1.  A ".dtnum" v
16380 61 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a  alue of 0 is.  *
16390 2a 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69  * used for termi
163a0 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66  nal symbols.  If
163b0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65   there is no %de
163c0 66 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e  fault_type defin
163d0 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69  ed then.  ** 0 i
163e0 73 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74  s also used as t
163f0 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20  he .dtnum value 
16400 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  for nonterminals
16410 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70   which do not sp
16420 65 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74  ecify.  ** a dat
16430 61 74 79 70 65 20 75 73 69 6e 67 20 74 68 65 20  atype using the 
16440 25 74 79 70 65 20 64 69 72 65 63 74 69 76 65 2e  %type directive.
16450 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
16460 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
16470 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
16480 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
16490 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
164a0 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a  ;.    char *cp;.
164b0 20 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70      if( sp==lemp
164c0 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20  ->errsym ){.    
164d0 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72    sp->dtnum = ar
164e0 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20  raysize+1;.     
164f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
16500 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
16510 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c  e!=NONTERMINAL |
16520 7c 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d  | (sp->datatype=
16530 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74  =0 && lemp->vart
16540 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  ype==0) ){.     
16550 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a   sp->dtnum = 0;.
16560 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
16570 20 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73      }.    cp = s
16580 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20  p->datatype;.   
16590 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20   if( cp==0 ) cp 
165a0 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b  = lemp->vartype;
165b0 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
165c0 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
165d0 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  cp) ) cp++;.    
165e0 77 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64  while( *cp ) std
165f0 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b  dt[j++] = *cp++;
16600 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20  .    while( j>0 
16610 26 26 20 69 73 73 70 61 63 65 28 73 74 64 64 74  && isspace(stddt
16620 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20  [j-1]) ) j--;.  
16630 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a    stddt[j] = 0;.
16640 20 20 20 20 68 61 73 68 20 3d 20 30 3b 0a 20 20      hash = 0;.  
16650 20 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64 74    for(j=0; stddt
16660 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  [j]; j++){.     
16670 20 68 61 73 68 20 3d 20 68 61 73 68 2a 35 33 20   hash = hash*53 
16680 2b 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20 20  + stddt[j];.    
16690 7d 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61  }.    hash = (ha
166a0 73 68 20 26 20 30 78 37 66 66 66 66 66 66 66 29  sh & 0x7fffffff)
166b0 25 61 72 72 61 79 73 69 7a 65 3b 0a 20 20 20 20  %arraysize;.    
166c0 77 68 69 6c 65 28 20 74 79 70 65 73 5b 68 61 73  while( types[has
166d0 68 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  h] ){.      if( 
166e0 73 74 72 63 6d 70 28 74 79 70 65 73 5b 68 61 73  strcmp(types[has
166f0 68 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b 0a  h],stddt)==0 ){.
16700 20 20 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75          sp->dtnu
16710 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20  m = hash + 1;.  
16720 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
16730 20 20 20 7d 0a 20 20 20 20 20 20 68 61 73 68 2b     }.      hash+
16740 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  +;.      if( has
16750 68 3e 3d 61 72 72 61 79 73 69 7a 65 20 29 20 68  h>=arraysize ) h
16760 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ash = 0;.    }. 
16770 20 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73     if( types[has
16780 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  h]==0 ){.      s
16790 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20  p->dtnum = hash 
167a0 2b 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65 73  + 1;.      types
167b0 5b 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a 29  [hash] = (char*)
167c0 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 73  malloc( strlen(s
167d0 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20  tddt)+1 );.     
167e0 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d   if( types[hash]
167f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
16800 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
16810 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
16820 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28  );.        exit(
16830 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
16840 20 20 73 74 72 63 70 79 28 74 79 70 65 73 5b 68    strcpy(types[h
16850 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20  ash],stddt);.   
16860 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69   }.  }..  /* Pri
16870 6e 74 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e  nt out the defin
16880 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e  ition of YYTOKEN
16890 54 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52  TYPE and YYMINOR
168a0 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d  TYPE */.  name =
168b0 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65   lemp->name ? le
168c0 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73  mp->name : "Pars
168d0 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a  e";.  lineno = *
168e0 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d  plineno;.  if( m
168f0 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66  hflag ){ fprintf
16900 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46  (out,"#if INTERF
16910 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ACE\n"); lineno+
16920 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  +; }.  fprintf(o
16930 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f  ut,"#define %sTO
16940 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61  KENTYPE %s\n",na
16950 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f  me,.    lemp->to
16960 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f  kentype?lemp->to
16970 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29  kentype:"void*")
16980 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69  ;  lineno++;.  i
16990 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72  f( mhflag ){ fpr
169a0 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66  intf(out,"#endif
169b0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
169c0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
169d0 22 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b  "typedef union {
169e0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
169f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
16a00 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 79 79 30   %sTOKENTYPE yy0
16a10 3b 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  ;\n",name); line
16a20 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  no++;.  for(i=0;
16a30 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b   i<arraysize; i+
16a40 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 79 70 65  +){.    if( type
16a50 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  s[i]==0 ) contin
16a60 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ue;.    fprintf(
16a70 6f 75 74 2c 22 20 20 25 73 20 79 79 25 64 3b 5c  out,"  %s yy%d;\
16a80 6e 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29  n",types[i],i+1)
16a90 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
16aa0 66 72 65 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a  free(types[i]);.
16ab0 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
16ac0 74 2c 22 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e  t,"  int yy%d;\n
16ad0 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ",lemp->errsym->
16ae0 64 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  dtnum); lineno++
16af0 3b 0a 20 20 66 72 65 65 28 73 74 64 64 74 29 3b  ;.  free(stddt);
16b00 0a 20 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a  .  free(types);.
16b10 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d    fprintf(out,"}
16b20 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22   YYMINORTYPE;\n"
16b30 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a  ); lineno++;.  *
16b40 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f  plineno = lineno
16b50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
16b60 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
16b70 43 20 64 61 74 61 74 79 70 65 20 61 62 6c 65 20  C datatype able 
16b80 74 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c  to represent val
16b90 75 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c  ues between.** l
16ba0 77 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c  wr and upr, incl
16bb0 75 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  usive..*/.static
16bc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e   const char *min
16bd0 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69  imum_size_type(i
16be0 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 29  nt lwr, int upr)
16bf0 7b 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29  {.  if( lwr>=0 )
16c00 7b 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32  {.    if( upr<=2
16c10 35 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  55 ){.      retu
16c20 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61  rn "unsigned cha
16c30 72 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  r";.    }else if
16c40 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20  ( upr<65535 ){. 
16c50 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73       return "uns
16c60 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22  igned short int"
16c70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16c80 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67     return "unsig
16c90 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a  ned int";.    }.
16ca0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
16cb0 3d 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32  =-127 && upr<=12
16cc0 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  7 ){.    return 
16cd0 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20  "signed char";. 
16ce0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
16cf0 2d 33 32 37 36 37 20 26 26 20 75 70 72 3c 33 32  -32767 && upr<32
16d00 37 36 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72  767 ){.    retur
16d10 6e 20 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c  n "short";.  }el
16d20 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22  se{.    return "
16d30 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  int";.  }.}../* 
16d40 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72 63  Generate C sourc
16d50 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70  e code for the p
16d60 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65  arser */.void Re
16d70 70 6f 72 74 54 61 62 6c 65 28 6c 65 6d 70 2c 20  portTable(lemp, 
16d80 6d 68 66 6c 61 67 29 0a 73 74 72 75 63 74 20 6c  mhflag).struct l
16d90 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20  emon *lemp;.int 
16da0 6d 68 66 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4f  mhflag;     /* O
16db0 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61  utput in makehea
16dc0 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74  ders format if t
16dd0 72 75 65 20 2a 2f 0a 7b 0a 20 20 46 49 4c 45 20  rue */.{.  FILE 
16de0 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61  *out, *in;.  cha
16df0 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
16e00 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b  ;.  int  lineno;
16e10 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
16e20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *stp;.  struct a
16e30 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72  ction *ap;.  str
16e40 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
16e50 73 74 72 75 63 74 20 61 63 74 74 61 62 20 2a 70  struct acttab *p
16e60 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69 2c  Acttab;.  int i,
16e70 20 6a 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 6e   j, n;.  char *n
16e80 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e  ame;.  int mnTkn
16e90 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b  Ofst, mxTknOfst;
16ea0 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c  .  int mnNtOfst,
16eb0 20 6d 78 4e 74 4f 66 73 74 3b 0a 0a 20 20 69 6e   mxNtOfst;..  in
16ec0 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d   = tplt_open(lem
16ed0 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  p);.  if( in==0 
16ee0 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20  ) return;.  out 
16ef0 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
16f00 2c 22 2e 63 22 2c 22 77 22 29 3b 0a 20 20 69 66  ,".c","w");.  if
16f10 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( out==0 ){.    
16f20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20  fclose(in);.    
16f30 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69  return;.  }.  li
16f40 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70 6c 74  neno = 1;.  tplt
16f50 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
16f60 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
16f70 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
16f80 20 74 68 65 20 69 6e 63 6c 75 64 65 20 63 6f 64   the include cod
16f90 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 74  e, if any */.  t
16fa0 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
16fb0 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65  mp,lemp->include
16fc0 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65 6c 6e  ,lemp->includeln
16fd0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69 66 28  ,&lineno);.  if(
16fe0 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63   mhflag ){.    c
16ff0 68 61 72 20 2a 6e 61 6d 65 20 3d 20 66 69 6c 65  har *name = file
17000 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20  _makename(lemp, 
17010 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72 69 6e  ".h");.    fprin
17020 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75 64 65  tf(out,"#include
17030 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 6e 61 6d 65   \"%s\"\n", name
17040 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
17050 20 66 72 65 65 28 6e 61 6d 65 29 3b 0a 20 20 7d   free(name);.  }
17060 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
17070 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
17080 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
17090 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e 65 73  enerate #defines
170a0 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73 20   for all tokens 
170b0 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  */.  if( mhflag 
170c0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 72 65  ){.    char *pre
170d0 66 69 78 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  fix;.    fprintf
170e0 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46  (out,"#if INTERF
170f0 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ACE\n"); lineno+
17100 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  +;.    if( lemp-
17110 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70  >tokenprefix ) p
17120 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f  refix = lemp->to
17130 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 65  kenprefix;.    e
17140 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  lse             
17150 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20         prefix = 
17160 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  "";.    for(i=1;
17170 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
17180 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
17190 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
171a0 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64  fine %s%-30s %2d
171b0 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d  \n",prefix,lemp-
171c0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
171d0 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65  e,i);.      line
171e0 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no++;.    }.    
171f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e  fprintf(out,"#en
17200 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
17210 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
17220 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
17230 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
17240 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
17250 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a 20 20 66  e defines */.  f
17260 70 72 69 6e 74 66 28 6f 75 74 2c 22 2f 2a 20 5c  printf(out,"/* \
17270 30 30 31 20 2a 2f 5c 6e 22 29 3b 0a 20 20 66 70  001 */\n");.  fp
17280 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
17290 6e 65 20 59 59 43 4f 44 45 54 59 50 45 20 25 73  ne YYCODETYPE %s
172a0 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d  \n",.    minimum
172b0 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65  _size_type(0, le
172c0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 35 29 29 3b  mp->nsymbol+5));
172d0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
172e0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
172f0 65 20 59 59 4e 4f 43 4f 44 45 20 25 64 5c 6e 22  e YYNOCODE %d\n"
17300 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31  ,lemp->nsymbol+1
17310 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
17320 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
17330 66 69 6e 65 20 59 59 41 43 54 49 4f 4e 54 59 50  fine YYACTIONTYP
17340 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e  E %s\n",.    min
17350 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30  imum_size_type(0
17360 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 6c  , lemp->nstate+l
17370 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35 29 29 3b 20  emp->nrule+5)); 
17380 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 70 72 69   lineno++;.  pri
17390 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f  nt_stack_union(o
173a0 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 2c  ut,lemp,&lineno,
173b0 6d 68 66 6c 61 67 29 3b 0a 20 20 69 66 28 20 6c  mhflag);.  if( l
173c0 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 29  emp->stacksize )
173d0 7b 0a 20 20 20 20 69 66 28 20 61 74 6f 69 28 6c  {.    if( atoi(l
173e0 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3c  emp->stacksize)<
173f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f  =0 ){.      Erro
17400 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
17410 61 6d 65 2c 30 2c 0a 22 49 6c 6c 65 67 61 6c 20  ame,0,."Illegal 
17420 73 74 61 63 6b 20 73 69 7a 65 3a 20 5b 25 73 5d  stack size: [%s]
17430 2e 20 20 54 68 65 20 73 74 61 63 6b 20 73 69 7a  .  The stack siz
17440 65 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  e should be an i
17450 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e  nteger constant.
17460 22 2c 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d  ",.        lemp-
17470 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20  >stacksize);.   
17480 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
17490 74 2b 2b 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  t++;.      lemp-
174a0 3e 73 74 61 63 6b 73 69 7a 65 20 3d 20 22 31 30  >stacksize = "10
174b0 30 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70  0";.    }.    fp
174c0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
174d0 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20  ne YYSTACKDEPTH 
174e0 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63  %s\n",lemp->stac
174f0 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ksize);  lineno+
17500 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
17510 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
17520 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54  fine YYSTACKDEPT
17530 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65  H 100\n");  line
17540 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  no++;.  }.  if( 
17550 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66 70  mhflag ){.    fp
17560 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49  rintf(out,"#if I
17570 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69  NTERFACE\n"); li
17580 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 6e 61  neno++;.  }.  na
17590 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20  me = lemp->name 
175a0 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22  ? lemp->name : "
175b0 50 61 72 73 65 22 3b 0a 20 20 69 66 28 20 6c 65  Parse";.  if( le
175c0 6d 70 2d 3e 61 72 67 20 26 26 20 6c 65 6d 70 2d  mp->arg && lemp-
175d0 3e 61 72 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69  >arg[0] ){.    i
175e0 6e 74 20 69 3b 0a 20 20 20 20 69 20 3d 20 73 74  nt i;.    i = st
175f0 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b  rlen(lemp->arg);
17600 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31  .    while( i>=1
17610 20 26 26 20 69 73 73 70 61 63 65 28 6c 65 6d 70   && isspace(lemp
17620 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d  ->arg[i-1]) ) i-
17630 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e  -;.    while( i>
17640 3d 31 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 6c  =1 && (isalnum(l
17650 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c  emp->arg[i-1]) |
17660 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  | lemp->arg[i-1]
17670 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20  =='_') ) i--;.  
17680 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
17690 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45  define %sARG_SDE
176a0 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c  CL %s;\n",name,l
176b0 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65  emp->arg);  line
176c0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
176d0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
176e0 73 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e  sARG_PDECL ,%s\n
176f0 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67  ",name,lemp->arg
17700 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
17710 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
17720 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54  define %sARG_FET
17730 43 48 20 25 73 20 3d 20 79 79 70 50 61 72 73 65  CH %s = yypParse
17740 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  r->%s\n",.      
17750 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
17760 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d  lemp->arg,&lemp-
17770 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e  >arg[i]);  linen
17780 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
17790 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
177a0 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72  ARG_STORE yypPar
177b0 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c  ser->%s = %s\n",
177c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
177d0 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72    name,&lemp->ar
177e0 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  g[i],&lemp->arg[
177f0 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i]);  lineno++;.
17800 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
17810 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
17820 65 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22  e %sARG_SDECL\n"
17830 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ,name);  lineno+
17840 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
17850 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
17860 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  G_PDECL\n",name)
17870 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
17880 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
17890 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43  efine %sARG_FETC
178a0 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65  H\n",name); line
178b0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
178c0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
178d0 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61  sARG_STORE\n",na
178e0 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
178f0 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20   }.  if( mhflag 
17900 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
17910 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
17920 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
17930 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
17940 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20 25 64  fine YYNSTATE %d
17950 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  \n",lemp->nstate
17960 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
17970 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
17980 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 25 64 5c  fine YYNRULE %d\
17990 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b  n",lemp->nrule);
179a0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70    lineno++;.  fp
179b0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
179c0 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c  ne YYERRORSYMBOL
179d0 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72   %d\n",lemp->err
179e0 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c 69  sym->index);  li
179f0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
17a00 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
17a10 59 45 52 52 53 59 4d 44 54 20 79 79 25 64 5c 6e  YERRSYMDT yy%d\n
17a20 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ",lemp->errsym->
17a30 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  dtnum);  lineno+
17a40 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68  +;.  if( lemp->h
17a50 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  as_fallback ){. 
17a60 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17a70 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c 42 41  #define YYFALLBA
17a80 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e  CK 1\n");  linen
17a90 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
17aa0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
17ab0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
17ac0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
17ad0 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
17ae0 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61   and its associa
17af0 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  tes:.  **.  **  
17b00 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20 20  yy_action[]     
17b10 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c     A single tabl
17b20 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c  e containing all
17b30 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20   actions..  **  
17b40 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 20  yy_lookahead[]  
17b50 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e 74 61     A table conta
17b60 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61 68  ining the lookah
17b70 65 61 64 20 66 6f 72 20 65 61 63 68 20 65 6e 74  ead for each ent
17b80 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20 20  ry in.  **      
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79                 y
17ba0 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65 64 20  y_action.  Used 
17bb0 74 6f 20 64 65 74 65 63 74 20 68 61 73 68 20 63  to detect hash c
17bc0 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20  ollisions..  ** 
17bd0 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
17be0 20 20 20 20 46 6f 72 20 65 61 63 68 20 73 74 61      For each sta
17bf0 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69  te, the offset i
17c00 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f  nto yy_action fo
17c10 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  r.  **          
17c20 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66 74             shift
17c30 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a 20  ing terminals.. 
17c40 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65 5f 6f   **  yy_reduce_o
17c50 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61 63 68  fst[]   For each
17c60 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73   state, the offs
17c70 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  et into yy_actio
17c80 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20  n for.  **      
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
17ca0 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d  hifting non-term
17cb0 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20 72 65  inals after a re
17cc0 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f 64  duce..  **  yy_d
17cd0 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20 20 44  efault[]       D
17ce0 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f  efault action fo
17cf0 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a 20 20  r each state..  
17d00 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  */..  /* Compute
17d10 20 74 68 65 20 61 63 74 69 6f 6e 73 20 6f 6e 20   the actions on 
17d20 61 6c 6c 20 73 74 61 74 65 73 20 61 6e 64 20 63  all states and c
17d30 6f 75 6e 74 20 74 68 65 6d 20 75 70 20 2a 2f 0a  ount them up */.
17d40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
17d50 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
17d60 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
17d70 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
17d80 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73  stp->nTknAct = s
17d90 74 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a  tp->nNtAct = 0;.
17da0 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d      stp->iDflt =
17db0 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
17dc0 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20  lemp->nrule;.   
17dd0 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d   stp->iTknOfst =
17de0 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20   NO_OFFSET;.    
17df0 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e  stp->iNtOfst = N
17e00 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f  O_OFFSET;.    fo
17e10 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
17e20 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
17e30 20 20 20 20 20 20 69 66 28 20 63 6f 6d 70 75 74        if( comput
17e40 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70  e_action(lemp,ap
17e50 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )>=0 ){.        
17e60 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
17e70 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
17e80 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
17e90 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20  tp->nTknAct++;. 
17ea0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
17eb0 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c   ap->sp->index<l
17ec0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a  emp->nsymbol ){.
17ed0 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e            stp->n
17ee0 4e 74 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20  NtAct++;.       
17ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17f00 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63    stp->iDflt = c
17f10 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
17f20 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20  mp, ap);.       
17f30 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
17f40 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74  .  }.  mxTknOfst
17f50 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30   = mnTknOfst = 0
17f60 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d  ;.  mxNtOfst = m
17f70 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 0a 20 20  nNtOfst = 0;..  
17f80 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61  /* Compute the a
17f90 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 44 6f  ction table.  Do
17fa0 20 74 68 69 73 20 69 6e 20 74 77 6f 20 70 61 73   this in two pas
17fb0 73 65 73 2e 20 20 54 68 65 20 66 69 72 73 74 0a  ses.  The first.
17fc0 20 20 2a 2a 20 70 61 73 73 20 64 6f 65 73 20 61    ** pass does a
17fd0 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ll entries with 
17fe0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 61 63 74 69  two or more acti
17ff0 6f 6e 73 20 61 6e 64 20 74 68 65 20 73 65 63 6f  ons and the seco
18000 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 64 6f 65  nd.  ** pass doe
18010 73 20 61 6c 6c 20 73 74 61 74 65 73 20 77 69 74  s all states wit
18020 68 20 61 20 73 69 6e 67 6c 65 20 61 63 74 69 6f  h a single actio
18030 6e 2e 0a 20 20 2a 2f 0a 20 20 70 41 63 74 74 61  n..  */.  pActta
18040 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f 63  b = acttab_alloc
18050 28 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ();.  for(j=0; j
18060 3c 3d 31 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 66  <=1; j++){.    f
18070 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
18080 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
18090 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
180a0 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 20  sorted[i];.     
180b0 20 69 66 28 20 28 6a 3d 3d 30 20 26 26 20 73 74   if( (j==0 && st
180c0 70 2d 3e 6e 54 6b 6e 41 63 74 3e 3d 32 29 20 7c  p->nTknAct>=2) |
180d0 7c 20 28 6a 3d 3d 31 20 26 26 20 73 74 70 2d 3e  | (j==1 && stp->
180e0 6e 54 6b 6e 41 63 74 3d 3d 31 29 20 29 7b 0a 20  nTknAct==1) ){. 
180f0 20 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74         for(ap=st
18100 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
18110 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
18120 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20     int action;. 
18130 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d           if( ap-
18140 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70  >sp->index>=lemp
18150 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f  ->nterminal ) co
18160 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
18170 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75    action = compu
18180 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20  te_action(lemp, 
18190 61 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ap);.          i
181a0 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f  f( action<0 ) co
181b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
181c0 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28    acttab_action(
181d0 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d  pActtab, ap->sp-
181e0 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b  >index, action);
181f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18200 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74     stp->iTknOfst
18210 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
18220 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20  (pActtab);.     
18230 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e     if( stp->iTkn
18240 4f 66 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29  Ofst<mnTknOfst )
18250 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70   mnTknOfst = stp
18260 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20  ->iTknOfst;.    
18270 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b      if( stp->iTk
18280 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66 73 74 20  nOfst>mxTknOfst 
18290 29 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 73 74  ) mxTknOfst = st
182a0 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20  p->iTknOfst;.   
182b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
182c0 6a 3d 3d 30 20 26 26 20 73 74 70 2d 3e 6e 4e 74  j==0 && stp->nNt
182d0 41 63 74 3e 3d 32 29 20 7c 7c 20 28 6a 3d 3d 31  Act>=2) || (j==1
182e0 20 26 26 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3d   && stp->nNtAct=
182f0 3d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  =1) ){.        f
18300 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
18310 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  p; ap=ap->next){
18320 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61  .          int a
18330 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 20  ction;.         
18340 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
18350 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  ex<lemp->ntermin
18360 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  al ) continue;. 
18370 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d           if( ap-
18380 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70  >sp->index==lemp
18390 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74  ->nsymbol ) cont
183a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
183b0 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65  action = compute
183c0 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70  _action(lemp, ap
183d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
183e0 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74   action<0 ) cont
183f0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
18400 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41  acttab_action(pA
18410 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69  cttab, ap->sp->i
18420 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20  ndex, action);. 
18430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18440 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20   stp->iNtOfst = 
18450 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41  acttab_insert(pA
18460 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20 20 20  cttab);.        
18470 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  if( stp->iNtOfst
18480 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e 4e 74  <mnNtOfst ) mnNt
18490 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f  Ofst = stp->iNtO
184a0 66 73 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fst;.        if(
184b0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78   stp->iNtOfst>mx
184c0 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73  NtOfst ) mxNtOfs
184d0 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
184e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
184f0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74    }..  /* Output
18500 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74   the yy_action t
18510 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
18520 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20 59 59  f(out,"static YY
18530 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 61 63  ACTIONTYPE yy_ac
18540 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20  tion[] = {\n"); 
18550 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20  lineno++;.  n = 
18560 61 63 74 74 61 62 5f 73 69 7a 65 28 70 41 63 74  acttab_size(pAct
18570 74 61 62 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  tab);.  for(i=j=
18580 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
18590 20 20 69 6e 74 20 61 63 74 69 6f 6e 20 3d 20 61    int action = a
185a0 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28 70  cttab_yyaction(p
185b0 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20  Acttab, i);.    
185c0 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 61  if( action<0 ) a
185d0 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73  ction = lemp->ns
185e0 79 6d 62 6f 6c 20 2b 20 6c 65 6d 70 2d 3e 6e 72  ymbol + lemp->nr
185f0 75 6c 65 20 2b 20 32 3b 0a 20 20 20 20 66 70 72  ule + 2;.    fpr
18600 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
18610 22 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  ", action);.    
18620 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
18630 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
18640 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
18650 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
18660 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
18670 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
18680 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
18690 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
186a0 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
186b0 75 74 70 75 74 20 74 68 65 20 79 79 5f 6c 6f 6f  utput the yy_loo
186c0 6b 61 68 65 61 64 20 74 61 62 6c 65 20 2a 2f 0a  kahead table */.
186d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73    fprintf(out,"s
186e0 74 61 74 69 63 20 59 59 43 4f 44 45 54 59 50 45  tatic YYCODETYPE
186f0 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20   yy_lookahead[] 
18700 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  = {\n"); lineno+
18710 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  +;.  for(i=j=0; 
18720 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
18730 6e 74 20 6c 61 20 3d 20 61 63 74 74 61 62 5f 79  nt la = acttab_y
18740 79 6c 6f 6f 6b 61 68 65 61 64 28 70 41 63 74 74  ylookahead(pActt
18750 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ab, i);.    if( 
18760 6c 61 3c 30 20 29 20 6c 61 20 3d 20 6c 65 6d 70  la<0 ) la = lemp
18770 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20 20 20 20 66  ->nsymbol;.    f
18780 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
18790 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20 20 69 66  d,", la);.    if
187a0 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
187b0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
187c0 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
187d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
187e0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
187f0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
18800 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
18810 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
18820 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74  eno++;..  /* Out
18830 70 75 74 20 74 68 65 20 79 79 5f 73 68 69 66 74  put the yy_shift
18840 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f  _ofst[] table */
18850 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
18860 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46  "#define YY_SHIF
18870 54 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c  T_USE_DFLT (%d)\
18880 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 2d 31 29  n", mnTknOfst-1)
18890 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
188a0 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74  rintf(out, "stat
188b0 69 63 20 25 73 20 79 79 5f 73 68 69 66 74 5f 6f  ic %s yy_shift_o
188c0 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20  fst[] = {\n", . 
188d0 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d           minimum
188e0 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54 6b 6e  _size_type(mnTkn
188f0 4f 66 73 74 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73  Ofst-1, mxTknOfs
18900 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  t)); lineno++;. 
18910 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74   n = lemp->nstat
18920 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  e;.  for(i=j=0; 
18930 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
18940 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73 74 70  nt ofst;.    stp
18950 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
18960 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d 20 73  i];.    ofst = s
18970 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20  tp->iTknOfst;.  
18980 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f    if( ofst==NO_O
18990 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d 20 6d  FFSET ) ofst = m
189a0 6e 54 6b 6e 4f 66 73 74 20 2d 20 31 3b 0a 20 20  nTknOfst - 1;.  
189b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
189c0 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20   %4d,", ofst);. 
189d0 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69     if( j==9 || i
189e0 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  ==n-1 ){.      f
189f0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
18a00 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
18a10 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65     j = 0;.    }e
18a20 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  lse{.      j++;.
18a30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
18a40 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29  ntf(out, "};\n")
18a50 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ; lineno++;..  /
18a60 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f  * Output the yy_
18a70 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61  reduce_ofst[] ta
18a80 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
18a90 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
18aa0 59 5f 52 45 44 55 43 45 5f 55 53 45 5f 44 46 4c  Y_REDUCE_USE_DFL
18ab0 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f  T (%d)\n", mnNtO
18ac0 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  fst-1); lineno++
18ad0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
18ae0 20 22 73 74 61 74 69 63 20 25 73 20 79 79 5f 72   "static %s yy_r
18af0 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20 7b  educe_ofst[] = {
18b00 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
18b10 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
18b20 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d 78  e(mnNtOfst-1, mx
18b30 4e 74 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f  NtOfst)); lineno
18b40 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e  ++;.  n = lemp->
18b50 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72 28 69 3d  nstate;.  for(i=
18b60 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
18b70 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20      int ofst;.  
18b80 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
18b90 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73  rted[i];.    ofs
18ba0 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
18bb0 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d  ;.    if( ofst==
18bc0 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74  NO_OFFSET ) ofst
18bd0 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b   = mnNtOfst - 1;
18be0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
18bf0 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29  , " %4d,", ofst)
18c00 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
18c10 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
18c20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
18c30 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
18c40 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
18c50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
18c60 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
18c70 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
18c80 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  n"); lineno++;..
18c90 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
18ca0 64 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 74  default action t
18cb0 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
18cc0 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 59  f(out, "static Y
18cd0 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 64  YACTIONTYPE yy_d
18ce0 65 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29  efault[] = {\n")
18cf0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20  ; lineno++;.  n 
18d00 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a  = lemp->nstate;.
18d10 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
18d20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
18d30 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
18d40 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ];.    fprintf(o
18d50 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 73 74 70  ut, " %4d,", stp
18d60 2d 3e 69 44 66 6c 74 29 3b 0a 20 20 20 20 69 66  ->iDflt);.    if
18d70 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31  ( j==9 || i==n-1
18d80 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
18d90 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69  f(out, "\n"); li
18da0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20  neno++;.      j 
18db0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
18dc0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d        j++;.    }
18dd0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
18de0 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e  ut, "};\n"); lin
18df0 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66  eno++;.  tplt_xf
18e00 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
18e10 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
18e20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
18e30 65 20 74 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62  e table of fallb
18e40 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f  ack tokens..  */
18e50 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73  .  if( lemp->has
18e60 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _fallback ){.   
18e70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
18e80 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b  ->nterminal; i++
18e90 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
18ea0 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70  symbol *p = lemp
18eb0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
18ec0 20 20 20 20 69 66 28 20 70 2d 3e 66 61 6c 6c 62      if( p->fallb
18ed0 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ack==0 ){.      
18ee0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
18ef0 20 20 20 20 30 2c 20 20 2f 2a 20 25 31 30 73 20      0,  /* %10s 
18f00 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22  => nothing */\n"
18f10 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  , p->name);.    
18f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18f30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
18f40 20 25 33 64 2c 20 20 2f 2a 20 25 31 30 73 20 3d   %3d,  /* %10s =
18f50 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66  > %s */\n", p->f
18f60 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a  allback->index,.
18f70 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d            p->nam
18f80 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e  e, p->fallback->
18f90 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  name);.      }. 
18fa0 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
18fb0 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f     }.  }.  tplt_
18fc0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
18fd0 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69 6e 65 6e   in, out, &linen
18fe0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
18ff0 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  te a table conta
19000 69 6e 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c  ining the symbol
19010 69 63 20 6e 61 6d 65 20 6f 66 20 65 76 65 72 79  ic name of every
19020 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66   symbol.  */.  f
19030 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
19040 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
19050 20 20 20 73 70 72 69 6e 74 66 28 6c 69 6e 65 2c     sprintf(line,
19060 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e  "\"%s\",",lemp->
19070 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
19080 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
19090 75 74 2c 22 20 20 25 2d 31 35 73 22 2c 6c 69 6e  ut,"  %-15s",lin
190a0 65 29 3b 0a 20 20 20 20 69 66 28 20 28 69 26 33  e);.    if( (i&3
190b0 29 3d 3d 33 20 29 7b 20 66 70 72 69 6e 74 66 28  )==3 ){ fprintf(
190c0 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  out,"\n"); linen
190d0 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28  o++; }.  }.  if(
190e0 20 28 69 26 33 29 21 3d 30 20 29 7b 20 66 70 72   (i&3)!=0 ){ fpr
190f0 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20  intf(out,"\n"); 
19100 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70  lineno++; }.  tp
19110 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
19120 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
19130 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
19140 74 65 20 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  te a table conta
19150 69 6e 69 6e 67 20 61 20 74 65 78 74 20 73 74 72  ining a text str
19160 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
19170 65 73 20 65 76 65 72 79 0a 20 20 2a 2a 20 72 75  es every.  ** ru
19180 6c 65 20 69 6e 20 74 68 65 20 72 75 6c 65 20 73  le in the rule s
19190 65 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 65  et of the gramme
191a0 72 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  r.  This informa
191b0 74 69 6f 6e 20 69 73 20 75 73 65 64 0a 20 20 2a  tion is used.  *
191c0 2a 20 77 68 65 6e 20 74 72 61 63 69 6e 67 20 52  * when tracing R
191d0 45 44 55 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20  EDUCE actions.. 
191e0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72   */.  for(i=0, r
191f0 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
19200 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69  ; rp=rp->next, i
19210 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
19220 20 72 70 2d 3e 69 6e 64 65 78 3d 3d 69 20 29 3b   rp->index==i );
19230 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
19240 2c 22 20 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 25  ," /* %3d */ \"%
19250 73 20 3a 3a 3d 22 2c 20 69 2c 20 72 70 2d 3e 6c  s ::=", i, rp->l
19260 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66  hs->name);.    f
19270 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72  or(j=0; j<rp->nr
19280 68 73 3b 20 6a 2b 2b 29 20 66 70 72 69 6e 74 66  hs; j++) fprintf
19290 28 6f 75 74 2c 22 20 25 73 22 2c 72 70 2d 3e 72  (out," %s",rp->r
192a0 68 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  hs[j]->name);.  
192b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c    fprintf(out,"\
192c0 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ",\n"); lineno++
192d0 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
192e0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
192f0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
19300 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
19310 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
19320 20 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79   every time a sy
19330 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66  mbol is popped f
19340 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  rom.  ** the sta
19350 63 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ck while process
19360 69 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68  ing errors or wh
19370 69 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74  ile destroying t
19380 68 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a  he parser. .  **
19390 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
193a0 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25  , generate the %
193b0 64 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f  destructor actio
193c0 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ns).  */.  if( l
193d0 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29  emp->tokendest )
193e0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
193f0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
19400 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
19410 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
19420 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
19430 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d  ;.      if( sp==
19440 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54  0 || sp->type!=T
19450 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e  ERMINAL ) contin
19460 75 65 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  ue;.      fprint
19470 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
19480 25 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65 78  %d:\n",sp->index
19490 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
194a0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
194b0 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  i<lemp->nsymbol 
194c0 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  && lemp->symbols
194d0 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49  [i]->type!=TERMI
194e0 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 69  NAL; i++);.    i
194f0 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  f( i<lemp->nsymb
19500 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74  ol ){.      emit
19510 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65  _destructor_code
19520 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  (out,lemp->symbo
19530 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65  ls[i],lemp,&line
19540 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  no);.      fprin
19550 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72  tf(out,"      br
19560 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  eak;\n"); lineno
19570 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
19580 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
19590 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
195a0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
195b0 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
195c0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66  mbols[i];.    if
195d0 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74  ( sp==0 || sp->t
195e0 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c  ype==TERMINAL ||
195f0 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3d   sp->destructor=
19600 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
19610 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19620 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c      case %d:\n",
19630 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65  sp->index); line
19640 6e 6f 2b 2b 3b 0a 20 20 20 20 65 6d 69 74 5f 64  no++;.    emit_d
19650 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f  estructor_code(o
19660 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ut,lemp->symbols
19670 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  [i],lemp,&lineno
19680 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
19690 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
196a0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
196b0 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
196c0 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73  vardest ){.    s
196d0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66  truct symbol *df
196e0 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 66  lt_sp = 0;.    f
196f0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
19700 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
19710 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
19720 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
19730 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
19740 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
19750 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
19760 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70   ||.          sp
19770 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70  ->index<=0 || sp
19780 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20  ->destructor!=0 
19790 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
197a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
197b0 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73     case %d:\n",s
197c0 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e  p->index); linen
197d0 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f  o++;.      dflt_
197e0 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20  sp = sp;.    }. 
197f0 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d     if( dflt_sp!=
19800 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f  0 ){.      emit_
19810 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
19820 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70  out,dflt_sp,lemp
19830 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ,&lineno);.     
19840 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
19850 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
19860 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
19870 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
19880 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
19890 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
198a0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
198b0 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
198c0 68 65 6e 65 76 65 72 20 74 68 65 20 70 61 72 73  henever the pars
198d0 65 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f  er stack overflo
198e0 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ws */.  tplt_pri
198f0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
19900 2d 3e 6f 76 65 72 66 6c 6f 77 2c 6c 65 6d 70 2d  ->overflow,lemp-
19910 3e 6f 76 65 72 66 6c 6f 77 6c 6e 2c 26 6c 69 6e  >overflowln,&lin
19920 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
19930 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
19940 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
19950 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
19960 20 74 61 62 6c 65 20 6f 66 20 72 75 6c 65 20 69   table of rule i
19970 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a  nformation .  **
19980 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73  .  ** Note: This
19990 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e   code depends on
199a0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 72   the fact that r
199b0 75 6c 65 73 20 61 72 65 20 6e 75 6d 62 65 72 0a  ules are number.
199c0 20 20 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c    ** sequentuall
199d0 79 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68  y beginning with
199e0 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72   0..  */.  for(r
199f0 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
19a00 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
19a10 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19a20 22 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e  "  { %d, %d },\n
19a30 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78  ",rp->lhs->index
19a40 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65  ,rp->nrhs); line
19a50 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
19a60 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
19a70 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
19a80 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19a90 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
19aa0 75 74 69 6f 6e 20 64 75 72 69 6e 67 20 65 61 63  ution during eac
19ab0 68 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20  h REDUCE action 
19ac0 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
19ad0 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
19ae0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 66 70  p->next){.    fp
19af0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
19b00 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 72 70 2d   case %d:\n",rp-
19b10 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
19b20 2b 3b 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64 65  +;.    emit_code
19b30 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69  (out,rp,lemp,&li
19b40 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e  neno);.    fprin
19b50 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20  tf(out,"        
19b60 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
19b70 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
19b80 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
19b90 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
19ba0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19bb0 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
19bc0 75 74 65 73 20 69 66 20 61 20 70 61 72 73 65 20  utes if a parse 
19bd0 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  fails */.  tplt_
19be0 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
19bf0 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 6c 65 6d  emp->failure,lem
19c00 70 2d 3e 66 61 69 6c 75 72 65 6c 6e 2c 26 6c 69  p->failureln,&li
19c10 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
19c20 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
19c30 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
19c40 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
19c50 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
19c60 73 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78 20  s when a syntax 
19c70 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a  error occurs */.
19c80 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
19c90 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f  ,lemp,lemp->erro
19ca0 72 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 6c 6e 2c  r,lemp->errorln,
19cb0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74  &lineno);.  tplt
19cc0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
19cd0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
19ce0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19cf0 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
19d00 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 70 61  utes when the pa
19d10 72 73 65 72 20 61 63 63 65 70 74 73 20 69 74 73  rser accepts its
19d20 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74   input */.  tplt
19d30 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
19d40 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c 6c 65 6d  lemp->accept,lem
19d50 70 2d 3e 61 63 63 65 70 74 6c 6e 2c 26 6c 69 6e  p->acceptln,&lin
19d60 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
19d70 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
19d80 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
19d90 20 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79 20 61   /* Append any a
19da0 64 64 69 74 69 6f 6e 20 63 6f 64 65 20 74 68 65  ddition code the
19db0 20 75 73 65 72 20 64 65 73 69 72 65 73 20 2a 2f   user desires */
19dc0 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
19dd0 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74  t,lemp,lemp->ext
19de0 72 61 63 6f 64 65 2c 6c 65 6d 70 2d 3e 65 78 74  racode,lemp->ext
19df0 72 61 63 6f 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f  racodeln,&lineno
19e00 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29  );..  fclose(in)
19e10 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b  ;.  fclose(out);
19e20 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
19e30 20 47 65 6e 65 72 61 74 65 20 61 20 68 65 61 64   Generate a head
19e40 65 72 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  er file for the 
19e50 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52  parser */.void R
19e60 65 70 6f 72 74 48 65 61 64 65 72 28 6c 65 6d 70  eportHeader(lemp
19e70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
19e80 6c 65 6d 70 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a  lemp;.{.  FILE *
19e90 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72  out, *in;.  char
19ea0 20 2a 70 72 65 66 69 78 3b 0a 20 20 63 68 61 72   *prefix;.  char
19eb0 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b   line[LINESIZE];
19ec0 0a 20 20 63 68 61 72 20 70 61 74 74 65 72 6e 5b  .  char pattern[
19ed0 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  LINESIZE];.  int
19ee0 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d   i;..  if( lemp-
19ef0 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70  >tokenprefix ) p
19f00 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f  refix = lemp->to
19f10 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c 73  kenprefix;.  els
19f20 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
19f30 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22       prefix = ""
19f40 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70  ;.  in = file_op
19f50 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 22  en(lemp,".h","r"
19f60 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a 20  );.  if( in ){. 
19f70 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65     for(i=1; i<le
19f80 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26  mp->nterminal &&
19f90 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45   fgets(line,LINE
19fa0 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a  SIZE,in); i++){.
19fb0 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70 61        sprintf(pa
19fc0 74 74 65 72 6e 2c 22 23 64 65 66 69 6e 65 20 25  ttern,"#define %
19fd0 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72  s%-30s %2d\n",pr
19fe0 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  efix,lemp->symbo
19ff0 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a  ls[i]->name,i);.
1a000 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
1a010 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20 29  (line,pattern) )
1a020 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a030 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1a040 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e    if( i==lemp->n
1a050 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20  terminal ){.    
1a060 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69    /* No change i
1a070 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e  n the file.  Don
1a080 27 74 20 72 65 77 72 69 74 65 20 69 74 2e 20 2a  't rewrite it. *
1a090 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  /.      return;.
1a0a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20      }.  }.  out 
1a0b0 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
1a0c0 2c 22 2e 68 22 2c 22 77 22 29 3b 0a 20 20 69 66  ,".h","w");.  if
1a0d0 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f 72  ( out ){.    for
1a0e0 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=1; i<lemp->nt
1a0f0 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20  erminal; i++){. 
1a100 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1a110 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30  ,"#define %s%-30
1a120 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c  s %2d\n",prefix,
1a130 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1a140 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d  ->name,i);.    }
1a150 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29  .    fclose(out)
1a160 3b 20 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ;  .  }.  return
1a170 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74  ;.}../* Reduce t
1a180 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
1a190 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66  ction tables, if
1a1a0 20 70 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d 61   possible, by ma
1a1b0 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64  king use.** of d
1a1c0 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  efaults..**.** I
1a1d0 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 2c 20  n this version, 
1a1e0 77 65 20 74 61 6b 65 20 74 68 65 20 6d 6f 73 74  we take the most
1a1f0 20 66 72 65 71 75 65 6e 74 20 52 45 44 55 43 45   frequent REDUCE
1a200 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65   action and make
1a210 0a 2a 2a 20 69 74 20 74 68 65 20 64 65 66 61 75  .** it the defau
1a220 6c 74 2e 20 20 4f 6e 6c 79 20 64 65 66 61 75 6c  lt.  Only defaul
1a230 74 20 61 20 72 65 64 75 63 65 20 69 66 20 74 68  t a reduce if th
1a240 65 72 65 20 61 72 65 20 6d 6f 72 65 20 74 68 61  ere are more tha
1a250 6e 20 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 43  n one..*/.void C
1a260 6f 6d 70 72 65 73 73 54 61 62 6c 65 73 28 6c 65  ompressTables(le
1a270 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
1a280 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
1a290 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
1a2a0 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1a2b0 61 70 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72 75  ap, *ap2;.  stru
1a2c0 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70  ct rule *rp, *rp
1a2d0 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74  2, *rbest;.  int
1a2e0 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74   nbest, n;.  int
1a2f0 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   i;..  for(i=0; 
1a300 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
1a310 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
1a320 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
1a330 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b 0a  .    nbest = 0;.
1a340 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a 0a      rbest = 0;..
1a350 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
1a360 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
1a370 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1a380 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  ap->type!=REDUCE
1a390 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1a3a0 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70     rp = ap->x.rp
1a3b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d  ;.      if( rp==
1a3c0 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65  rbest ) continue
1a3d0 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20  ;.      n = 1;. 
1a3e0 20 20 20 20 20 66 6f 72 28 61 70 32 3d 61 70 2d       for(ap2=ap-
1a3f0 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61 70 32 3d  >next; ap2; ap2=
1a400 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  ap2->next){.    
1a410 20 20 20 20 69 66 28 20 61 70 32 2d 3e 74 79 70      if( ap2->typ
1a420 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74  e!=REDUCE ) cont
1a430 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 72 70  inue;.        rp
1a440 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70 3b 0a 20  2 = ap2->x.rp;. 
1a450 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d         if( rp2==
1a460 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65  rbest ) continue
1a470 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
1a480 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20 20 20  2==rp ) n++;.   
1a490 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
1a4a0 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20 20 20 20  >nbest ){.      
1a4b0 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a 20 20 20    nbest = n;.   
1a4c0 20 20 20 20 20 72 62 65 73 74 20 3d 20 72 70 3b       rbest = rp;
1a4d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a4e0 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d  .    /* Do not m
1a4f0 61 6b 65 20 61 20 64 65 66 61 75 6c 74 20 69 66  ake a default if
1a500 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1a510 75 6c 65 73 20 74 6f 20 64 65 66 61 75 6c 74 0a  ules to default.
1a520 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74      ** is not at
1a530 20 6c 65 61 73 74 20 32 20 2a 2f 0a 20 20 20 20   least 2 */.    
1a540 69 66 28 20 6e 62 65 73 74 3c 32 20 29 20 63 6f  if( nbest<2 ) co
1a550 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a  ntinue;...    /*
1a560 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e   Combine matchin
1a570 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73  g REDUCE actions
1a580 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64   into a single d
1a590 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f  efault */.    fo
1a5a0 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1a5b0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1a5c0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1a5d0 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
1a5e0 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20  ->x.rp==rbest ) 
1a5f0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1a600 20 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20   assert( ap );. 
1a610 20 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62     ap->sp = Symb
1a620 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74  ol_new("{default
1a630 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  }");.    for(ap=
1a640 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70  ap->next; ap; ap
1a650 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1a660 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
1a670 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e  REDUCE && ap->x.
1a680 72 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e  rp==rbest ) ap->
1a690 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b  type = NOT_USED;
1a6a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e  .    }.    stp->
1a6b0 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74  ap = Action_sort
1a6c0 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d  (stp->ap);.  }.}
1a6d0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1a6e0 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
1a6f0 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a  le "set.c" *****
1a700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1a720 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70  ./*.** Set manip
1a730 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73  ulation routines
1a740 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70   for the LEMON p
1a750 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
1a760 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
1a770 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65  size = 0;../* Se
1a780 74 20 74 68 65 20 73 65 74 20 73 69 7a 65 20 2a  t the set size *
1a790 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28 6e  /.void SetSize(n
1a7a0 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 69 7a  ).int n;.{.  siz
1a7b0 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41  e = n+1;.}../* A
1a7c0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65  llocate a new se
1a7d0 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65  t */.char *SetNe
1a7e0 77 28 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a  w(){.  char *s;.
1a7f0 20 20 69 6e 74 20 69 3b 0a 20 20 73 20 3d 20 28    int i;.  s = (
1a800 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  char*)malloc( si
1a810 7a 65 20 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30  ze );.  if( s==0
1a820 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76   ){.    extern v
1a830 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72  oid memory_error
1a840 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65  ();.    memory_e
1a850 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 66 6f  rror();.  }.  fo
1a860 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
1a870 2b 2b 29 20 73 5b 69 5d 20 3d 20 30 3b 0a 20 20  ++) s[i] = 0;.  
1a880 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20  return s;.}../* 
1a890 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74  Deallocate a set
1a8a0 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65 65   */.void SetFree
1a8b0 28 73 29 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a 20  (s).char *s;.{. 
1a8c0 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20   free(s);.}../* 
1a8d0 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
1a8e0 74 20 74 6f 20 74 68 65 20 73 65 74 2e 20 20 52  t to the set.  R
1a8f0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1a900 65 20 65 6c 65 6d 65 6e 74 20 77 61 73 20 61 64  e element was ad
1a910 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45  ded.** and FALSE
1a920 20 69 66 20 69 74 20 77 61 73 20 61 6c 72 65 61   if it was alrea
1a930 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74  dy there. */.int
1a940 20 53 65 74 41 64 64 28 73 2c 65 29 0a 63 68 61   SetAdd(s,e).cha
1a950 72 20 2a 73 3b 0a 69 6e 74 20 65 3b 0a 7b 0a 20  r *s;.int e;.{. 
1a960 20 69 6e 74 20 72 76 3b 0a 20 20 72 76 20 3d 20   int rv;.  rv = 
1a970 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31  s[e];.  s[e] = 1
1a980 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b 0a  ;.  return !rv;.
1a990 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79 20  }../* Add every 
1a9a0 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f  element of s2 to
1a9b0 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52 55   s1.  Return TRU
1a9c0 45 20 69 66 20 73 31 20 63 68 61 6e 67 65 73 2e  E if s1 changes.
1a9d0 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e   */.int SetUnion
1a9e0 28 73 31 2c 73 32 29 0a 63 68 61 72 20 2a 73 31  (s1,s2).char *s1
1a9f0 3b 0a 63 68 61 72 20 2a 73 32 3b 0a 7b 0a 20 20  ;.char *s2;.{.  
1aa00 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73 73 3b  int i, progress;
1aa10 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b  .  progress = 0;
1aa20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
1aa30 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ze; i++){.    if
1aa40 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  ( s2[i]==0 ) con
1aa50 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
1aa60 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  1[i]==0 ){.     
1aa70 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20   progress = 1;. 
1aa80 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a       s1[i] = 1;.
1aa90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1aaa0 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f  rn progress;.}./
1aab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aac0 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
1aad0 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22 20 2a  file "table.c" *
1aae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1aaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
1ab00 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74  ** All code in t
1ab10 68 69 73 20 66 69 6c 65 20 68 61 73 20 62 65 65  his file has bee
1ab20 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  n automatically 
1ab30 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f  generated.** fro
1ab40 6d 20 61 20 73 70 65 63 69 66 69 63 61 74 69 6f  m a specificatio
1ab50 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  n in the file.**
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
1ab70 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68  able.q".** by th
1ab80 65 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  e associative ar
1ab90 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e  ray code buildin
1aba0 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e  g program "aagen
1abb0 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69  "..** Do not edi
1abc0 74 20 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e  t this file!  In
1abd0 73 74 65 61 64 2c 20 65 64 69 74 20 74 68 65 20  stead, edit the 
1abe0 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a  specification.**
1abf0 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75   file, then reru
1ac00 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a  n aagen..*/./*.*
1ac10 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65  * Code for proce
1ac20 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20  ssing tables in 
1ac30 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
1ac40 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
1ac50 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 72 68  PRIVATE int strh
1ac60 61 73 68 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a  ash(x).char *x;.
1ac70 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20  {.  int h = 0;. 
1ac80 20 77 68 69 6c 65 28 20 2a 78 29 20 68 20 3d 20   while( *x) h = 
1ac90 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20  h*13 + *(x++);. 
1aca0 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
1acb0 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72 64   Works like strd
1acc0 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53 61  up, sort of.  Sa
1acd0 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  ve a string in m
1ace0 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20  alloced memory, 
1acf0 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69  but.** keep stri
1ad00 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73  ngs in a table s
1ad10 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  o that the same 
1ad20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e  string is not in
1ad30 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e   more.** than on
1ad40 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 68 61 72  e place..*/.char
1ad50 20 2a 53 74 72 73 61 66 65 28 79 29 0a 63 68 61   *Strsafe(y).cha
1ad60 72 20 2a 79 3b 0a 7b 0a 20 20 63 68 61 72 20 2a  r *y;.{.  char *
1ad70 7a 3b 0a 0a 20 20 7a 20 3d 20 53 74 72 73 61 66  z;..  z = Strsaf
1ad80 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20 69 66 28  e_find(y);.  if(
1ad90 20 7a 3d 3d 30 20 26 26 20 28 7a 3d 6d 61 6c 6c   z==0 && (z=mall
1ada0 6f 63 28 20 73 74 72 6c 65 6e 28 79 29 2b 31 20  oc( strlen(y)+1 
1adb0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))!=0 ){.    str
1adc0 63 70 79 28 7a 2c 79 29 3b 0a 20 20 20 20 53 74  cpy(z,y);.    St
1add0 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b  rsafe_insert(z);
1ade0 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65  .  }.  MemoryChe
1adf0 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ck(z);.  return 
1ae00 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  z;.}../* There i
1ae10 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1ae20 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1ae30 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
1ae40 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
1ae50 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
1ae60 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x1"..*/.struct 
1ae70 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x1 {.  int siz
1ae80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1ae90 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1aea0 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
1aeb0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aed0 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
1aee0 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
1aef0 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
1af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af10 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
1af20 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
1af30 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
1af40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1af50 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
1af60 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
1af70 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62  uct s_x1node *tb
1af80 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
1af90 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
1afa0 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1afb0 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
1afc0 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
1afd0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
1afe0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1aff0 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
1b000 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
1b010 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
1b020 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
1b030 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
1b040 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  1"..*/.typedef s
1b050 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b  truct s_x1node {
1b060 0a 20 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  .  char *data;  
1b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b080 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
1b090 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1b0a0 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
1b0b0 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
1b0c0 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
1b0d0 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
1b0e0 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
1b0f0 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
1b100 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  1node;../* There
1b110 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
1b120 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
1b130 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
1b140 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
1b150 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 31  atic struct s_x1
1b160 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x1a;../* Alloc
1b170 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
1b180 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
1b190 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74  oid Strsafe_init
1b1a0 28 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20  (){.  if( x1a ) 
1b1b0 72 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20  return;.  x1a = 
1b1c0 28 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61  (struct s_x1*)ma
1b1d0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
1b1e0 75 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69  uct s_x1) );.  i
1b1f0 66 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31  f( x1a ){.    x1
1b200 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  a->size = 1024;.
1b210 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d      x1a->count =
1b220 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c   0;.    x1a->tbl
1b230 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x1node*)mall
1b240 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
1b250 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x1node) + siz
1b260 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 31 30  eof(x1node*))*10
1b270 32 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 31  24 );.    if( x1
1b280 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
1b290 20 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20     free(x1a);.  
1b2a0 20 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20      x1a = 0;.   
1b2b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1b2c0 74 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e  t i;.      x1a->
1b2d0 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26  ht = (x1node**)&
1b2e0 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29  (x1a->tbl[1024])
1b2f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1b300 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31   i<1024; i++) x1
1b310 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
1b320 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
1b330 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
1b340 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
1b350 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1b360 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
1b370 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
1b380 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
1b390 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
1b3a0 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  */.int Strsafe_i
1b3b0 6e 73 65 72 74 28 64 61 74 61 29 0a 63 68 61 72  nsert(data).char
1b3c0 20 2a 64 61 74 61 3b 0a 7b 0a 20 20 78 31 6e 6f   *data;.{.  x1no
1b3d0 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b  de *np;.  int h;
1b3e0 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66  .  int ph;..  if
1b3f0 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x1a==0 ) retur
1b400 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68  n 0;.  ph = strh
1b410 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d  ash(data);.  h =
1b420 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65   ph & (x1a->size
1b430 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d  -1);.  np = x1a-
1b440 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
1b450 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
1b460 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64  trcmp(np->data,d
1b470 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ata)==0 ){.     
1b480 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
1b490 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
1b4a0 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
1b4b0 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
1b4c0 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
1b4d0 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
1b4e0 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
1b4f0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1b500 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
1b510 20 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63    }.  if( x1a->c
1b520 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20  ount>=x1a->size 
1b530 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
1b540 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
1b550 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
1b560 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a      int i,size;.
1b570 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 31 20      struct s_x1 
1b580 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
1b590 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78  .size = size = x
1b5a0 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  1a->size*2;.    
1b5b0 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31  array.count = x1
1b5c0 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
1b5d0 72 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64  ray.tbl = (x1nod
1b5e0 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e*)malloc(.     
1b5f0 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29   (sizeof(x1node)
1b600 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
1b610 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20  *))*size );.    
1b620 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
1b630 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
1b640 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
1b650 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
1b660 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
1b670 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  1node**)&(array.
1b680 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20  tbl[size]);.    
1b690 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1b6a0 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
1b6b0 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
1b6c0 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74  =0; i<x1a->count
1b6d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31  ; i++){.      x1
1b6e0 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
1b6f0 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
1b700 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d   = &(x1a->tbl[i]
1b710 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72  );.      h = str
1b720 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61  hash(oldnp->data
1b730 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
1b740 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
1b750 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
1b760 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
1b770 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
1b780 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
1b790 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
1b7a0 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
1b7b0 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
1b7c0 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
1b7d0 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
1b7e0 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
1b7f0 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
1b800 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
1b810 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
1b820 20 20 20 20 66 72 65 65 28 78 31 61 2d 3e 74 62      free(x1a->tb
1b830 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20 61  l);.    *x1a = a
1b840 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
1b850 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
1b860 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
1b870 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
1b880 20 20 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62    np = &(x1a->tb
1b890 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x1a->count++])
1b8a0 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
1b8b0 61 74 61 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e  ata;.  if( x1a->
1b8c0 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b  ht[h] ) x1a->ht[
1b8d0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
1b8e0 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
1b8f0 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  xt = x1a->ht[h];
1b900 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x1a->ht[h] = 
1b910 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
1b920 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x1a->ht[h]);.
1b930 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1b940 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1b950 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
1b960 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
1b970 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
1b980 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
1b990 20 6b 65 79 2e 20 2a 2f 0a 63 68 61 72 20 2a 53   key. */.char *S
1b9a0 74 72 73 61 66 65 5f 66 69 6e 64 28 6b 65 79 29  trsafe_find(key)
1b9b0 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20  .char *key;.{.  
1b9c0 69 6e 74 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20  int h;.  x1node 
1b9d0 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d  *np;..  if( x1a=
1b9e0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1b9f0 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79   h = strhash(key
1ba00 29 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  ) & (x1a->size-1
1ba10 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68  );.  np = x1a->h
1ba20 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1ba30 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
1ba40 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79  cmp(np->data,key
1ba50 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
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 72 65 74 75 72 6e 20 6e 70  .  }.  return np
1ba80 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
1ba90 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
1baa0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28  pointer to the (
1bab0 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74  terminal or nont
1bac0 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20  erminal) symbol 
1bad0 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61  "x"..** Create a
1bae0 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74   new symbol if t
1baf0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1bb00 20 74 69 6d 65 20 22 78 22 20 68 61 73 20 62 65   time "x" has be
1bb10 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75  en seen..*/.stru
1bb20 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
1bb30 6c 5f 6e 65 77 28 78 29 0a 63 68 61 72 20 2a 78  l_new(x).char *x
1bb40 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ;.{.  struct sym
1bb50 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d  bol *sp;..  sp =
1bb60 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b   Symbol_find(x);
1bb70 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a  .  if( sp==0 ){.
1bb80 20 20 20 20 73 70 20 3d 20 28 73 74 72 75 63 74      sp = (struct
1bb90 20 73 79 6d 62 6f 6c 20 2a 29 6d 61 6c 6c 6f 63   symbol *)malloc
1bba0 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
1bbb0 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20 20 4d  symbol) );.    M
1bbc0 65 6d 6f 72 79 43 68 65 63 6b 28 73 70 29 3b 0a  emoryCheck(sp);.
1bbd0 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d 20 53      sp->name = S
1bbe0 74 72 73 61 66 65 28 78 29 3b 0a 20 20 20 20 73  trsafe(x);.    s
1bbf0 70 2d 3e 74 79 70 65 20 3d 20 69 73 75 70 70 65  p->type = isuppe
1bc00 72 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e 41 4c  r(*x) ? TERMINAL
1bc10 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a   : NONTERMINAL;.
1bc20 20 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d 20 30      sp->rule = 0
1bc30 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61  ;.    sp->fallba
1bc40 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  ck = 0;.    sp->
1bc50 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20 20 73  prec = -1;.    s
1bc60 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a  p->assoc = UNK;.
1bc70 20 20 20 20 73 70 2d 3e 66 69 72 73 74 73 65 74      sp->firstset
1bc80 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 6c 61   = 0;.    sp->la
1bc90 6d 62 64 61 20 3d 20 42 5f 46 41 4c 53 45 3b 0a  mbda = B_FALSE;.
1bca0 20 20 20 20 73 70 2d 3e 64 65 73 74 72 75 63 74      sp->destruct
1bcb0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  or = 0;.    sp->
1bcc0 64 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20  datatype = 0;.  
1bcd0 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28    Symbol_insert(
1bce0 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  sp,sp->name);.  
1bcf0 7d 0a 20 20 72 65 74 75 72 6e 20 73 70 3b 0a 7d  }.  return sp;.}
1bd00 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  ../* Compare two
1bd10 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 69 6e 74 20   symbols */.int 
1bd20 53 79 6d 62 6f 6c 63 6d 70 70 28 61 2c 62 29 0a  Symbolcmpp(a,b).
1bd30 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
1bd40 61 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  a;.struct symbol
1bd50 20 2a 2a 62 3b 0a 7b 0a 20 20 72 65 74 75 72 6e   **b;.{.  return
1bd60 20 73 74 72 63 6d 70 28 28 2a 2a 61 29 2e 6e 61   strcmp((**a).na
1bd70 6d 65 2c 28 2a 2a 62 29 2e 6e 61 6d 65 29 3b 0a  me,(**b).name);.
1bd80 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
1bd90 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1bda0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1bdb0 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
1bdc0 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
1bdd0 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32  rray of type "x2
1bde0 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
1bdf0 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  2 {.  int size; 
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1be10 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
1be20 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
1be30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1be40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1be50 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
1be60 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
1be70 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
1be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be90 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
1bea0 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
1beb0 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1bec0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
1bed0 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
1bee0 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
1bef0 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x2node *tbl; 
1bf00 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
1bf10 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
1bf20 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a  ruct s_x2node **
1bf30 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
1bf40 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
1bf50 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
1bf60 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1bf70 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1bf80 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
1bf90 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
1bfa0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
1bfb0 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e  ay of type "x2".
1bfc0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1bfd0 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20  ct s_x2node {.  
1bfe0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
1bff0 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
1c000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1c010 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6b 65 79  a */.  char *key
1c020 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c030 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
1c040 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
1c050 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
1c060 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
1c070 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
1c080 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
1c090 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
1c0a0 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
1c0b0 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x2node;../* Th
1c0c0 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
1c0d0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1c0e0 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
1c0f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
1c100 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
1c110 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c  _x2 *x2a;../* Al
1c120 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
1c130 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
1c140 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e  /.void Symbol_in
1c150 69 74 28 29 7b 0a 20 20 69 66 28 20 78 32 61 20  it(){.  if( x2a 
1c160 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61 20  ) return;.  x2a 
1c170 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a 29  = (struct s_x2*)
1c180 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
1c190 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a 20  truct s_x2) );. 
1c1a0 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20 20   if( x2a ){.    
1c1b0 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b  x2a->size = 128;
1c1c0 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20  .    x2a->count 
1c1d0 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62  = 0;.    x2a->tb
1c1e0 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c  l = (x2node*)mal
1c1f0 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a  loc( .      (siz
1c200 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69  eof(x2node) + si
1c210 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 31  zeof(x2node*))*1
1c220 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 32  28 );.    if( x2
1c230 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
1c240 20 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20 20     free(x2a);.  
1c250 20 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20 20      x2a = 0;.   
1c260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1c270 74 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e  t i;.      x2a->
1c280 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26  ht = (x2node**)&
1c290 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b  (x2a->tbl[128]);
1c2a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1c2b0 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d  i<128; i++) x2a-
1c2c0 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
1c2d0 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
1c2e0 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
1c2f0 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
1c300 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
1c310 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
1c320 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
1c330 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
1c340 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
1c350 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
1c360 72 74 28 64 61 74 61 2c 6b 65 79 29 0a 73 74 72  rt(data,key).str
1c370 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
1c380 3b 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20  ;.char *key;.{. 
1c390 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69   x2node *np;.  i
1c3a0 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a  nt h;.  int ph;.
1c3b0 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20  .  if( x2a==0 ) 
1c3c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
1c3d0 20 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20   strhash(key);. 
1c3e0 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e   h = ph & (x2a->
1c3f0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
1c400 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x2a->ht[h];.  wh
1c410 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
1c420 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65  f( strcmp(np->ke
1c430 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  y,key)==0 ){.   
1c440 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
1c450 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
1c460 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
1c470 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
1c480 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
1c490 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
1c4a0 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
1c4b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1c4c0 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
1c4d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d  ;.  }.  if( x2a-
1c4e0 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a  >count>=x2a->siz
1c4f0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
1c500 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
1c510 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
1c520 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65  /.    int i,size
1c530 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
1c540 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  2 array;.    arr
1c550 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d  ay.size = size =
1c560 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x2a->size*2;.  
1c570 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
1c580 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x2a->count;.    
1c590 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e  array.tbl = (x2n
1c5a0 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20  ode*)malloc(.   
1c5b0 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64     (sizeof(x2nod
1c5c0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f  e) + sizeof(x2no
1c5d0 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20  de*))*size );.  
1c5e0 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
1c5f0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
1c600 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
1c610 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
1c620 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
1c630 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x2node**)&(arra
1c640 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20  y.tbl[size]);.  
1c650 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1c660 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
1c670 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
1c680 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f 75  (i=0; i<x2a->cou
1c690 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
1c6a0 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x2node *oldnp, *
1c6b0 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
1c6c0 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b  np = &(x2a->tbl[
1c6d0 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73  i]);.      h = s
1c6e0 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65  trhash(oldnp->ke
1c6f0 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20  y) & (size-1);. 
1c700 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61       newnp = &(a
1c710 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20  rray.tbl[i]);.  
1c720 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74      if( array.ht
1c730 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68  [h] ) array.ht[h
1c740 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e  ]->from = &(newn
1c750 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20  p->next);.      
1c760 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72  newnp->next = ar
1c770 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20  ray.ht[h];.     
1c780 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c   newnp->key = ol
1c790 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20  dnp->key;.      
1c7a0 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
1c7b0 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
1c7c0 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
1c7d0 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
1c7e0 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
1c7f0 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
1c800 20 20 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62      free(x2a->tb
1c810 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61  l);.    *x2a = a
1c820 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
1c830 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
1c840 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
1c850 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
1c860 20 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62    np = &(x2a->tb
1c870 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x2a->count++])
1c880 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65  ;.  np->key = ke
1c890 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20  y;.  np->data = 
1c8a0 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d  data;.  if( x2a-
1c8b0 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74  >ht[h] ) x2a->ht
1c8c0 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70  [h]->from = &(np
1c8d0 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e  ->next);.  np->n
1c8e0 65 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d  ext = x2a->ht[h]
1c8f0 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d  ;.  x2a->ht[h] =
1c900 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20   np;.  np->from 
1c910 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b  = &(x2a->ht[h]);
1c920 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1c930 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
1c940 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69  ter to data assi
1c950 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65  gned to the give
1c960 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e  n key.  Return N
1c970 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63  ULL.** if no suc
1c980 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74  h key. */.struct
1c990 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
1c9a0 66 69 6e 64 28 6b 65 79 29 0a 63 68 61 72 20 2a  find(key).char *
1c9b0 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a  key;.{.  int h;.
1c9c0 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x2node *np;.. 
1c9d0 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
1c9e0 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74  turn 0;.  h = st
1c9f0 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 32  rhash(key) & (x2
1ca00 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1ca10 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
1ca20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
1ca30 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
1ca40 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62  >key,key)==0 ) b
1ca50 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e  reak;.    np = n
1ca60 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  p->next;.  }.  r
1ca70 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64  eturn np ? np->d
1ca80 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  ata : 0;.}../* R
1ca90 65 74 75 72 6e 20 74 68 65 20 6e 2d 74 68 20 64  eturn the n-th d
1caa0 61 74 61 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ata.  Return NUL
1cab0 4c 20 69 66 20 6e 20 69 73 20 6f 75 74 20 6f 66  L if n is out of
1cac0 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63   range. */.struc
1cad0 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
1cae0 5f 4e 74 68 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  _Nth(n).int n;.{
1caf0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1cb00 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32   *data;.  if( x2
1cb10 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78  a && n>0 && n<=x
1cb20 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20  2a->count ){.   
1cb30 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c   data = x2a->tbl
1cb40 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65  [n-1].data;.  }e
1cb50 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20  lse{.    data = 
1cb60 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1cb70 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  data;.}../* Retu
1cb80 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
1cb90 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20  he array */.int 
1cba0 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b  Symbol_count().{
1cbb0 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f 20  .  return x2a ? 
1cbc0 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a  x2a->count : 0;.
1cbd0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20  }../* Return an 
1cbe0 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
1cbf0 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e  s to all data in
1cc00 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54   the table..** T
1cc10 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
1cc20 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
1cc30 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1cc40 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
1cc50 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c  ion.** problems,
1cc60 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79   or if the array
1cc70 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74   is empty. */.st
1cc80 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79  ruct symbol **Sy
1cc90 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b  mbol_arrayof().{
1cca0 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1ccb0 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20   **array;.  int 
1ccc0 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 32  i,size;.  if( x2
1ccd0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
1cce0 0a 20 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 63  .  size = x2a->c
1ccf0 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20  ount;.  array = 
1cd00 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
1cd10 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
1cd20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
1cd30 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  )*size );.  if( 
1cd40 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72  array ){.    for
1cd50 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
1cd60 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 32  +) array[i] = x2
1cd70 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a  a->tbl[i].data;.
1cd80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72    }.  return arr
1cd90 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72  ay;.}../* Compar
1cda0 65 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61 74  e two configurat
1cdb0 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66  ions */.int Conf
1cdc0 69 67 63 6d 70 28 61 2c 62 29 0a 73 74 72 75 63  igcmp(a,b).struc
1cdd0 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72  t config *a;.str
1cde0 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b  uct config *b;.{
1cdf0 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20  .  int x;.  x = 
1ce00 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62  a->rp->index - b
1ce10 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69  ->rp->index;.  i
1ce20 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d  f( x==0 ) x = a-
1ce30 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20  >dot - b->dot;. 
1ce40 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a   return x;.}../*
1ce50 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61   Compare two sta
1ce60 74 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20 69  tes */.PRIVATE i
1ce70 6e 74 20 73 74 61 74 65 63 6d 70 28 61 2c 62 29  nt statecmp(a,b)
1ce80 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1ce90 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a;.struct config
1cea0 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 72 63 3b   *b;.{.  int rc;
1ceb0 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d  .  for(rc=0; rc=
1cec0 3d 30 20 26 26 20 61 20 26 26 20 62 3b 20 20 61  =0 && a && b;  a
1ced0 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29  =a->bp, b=b->bp)
1cee0 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e 72 70  {.    rc = a->rp
1cef0 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d  ->index - b->rp-
1cf00 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  >index;.    if( 
1cf10 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e  rc==0 ) rc = a->
1cf20 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20  dot - b->dot;.  
1cf30 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  }.  if( rc==0 ){
1cf40 0a 20 20 20 20 69 66 28 20 61 20 29 20 72 63 20  .    if( a ) rc 
1cf50 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 62 20 29  = 1;.    if( b )
1cf60 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20   rc = -1;.  }.  
1cf70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1cf80 20 48 61 73 68 20 61 20 73 74 61 74 65 20 2a 2f   Hash a state */
1cf90 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61  .PRIVATE int sta
1cfa0 74 65 68 61 73 68 28 61 29 0a 73 74 72 75 63 74  tehash(a).struct
1cfb0 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20   config *a;.{.  
1cfc0 69 6e 74 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65  int h=0;.  while
1cfd0 28 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68  ( a ){.    h = h
1cfe0 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e  *571 + a->rp->in
1cff0 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b  dex*37 + a->dot;
1d000 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a  .    a = a->bp;.
1d010 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a    }.  return h;.
1d020 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  }../* Allocate a
1d030 20 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63   new state struc
1d040 74 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73  ture */.struct s
1d050 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28  tate *State_new(
1d060 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  ).{.  struct sta
1d070 74 65 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20 3d  te *new;.  new =
1d080 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
1d090 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
1d0a0 73 74 72 75 63 74 20 73 74 61 74 65 29 20 29 3b  struct state) );
1d0b0 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e  .  MemoryCheck(n
1d0c0 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ew);.  return ne
1d0d0 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  w;.}../* There i
1d0e0 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1d0f0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1d100 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
1d110 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
1d120 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
1d130 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x3"..*/.struct 
1d140 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x3 {.  int siz
1d150 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1d160 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1d170 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
1d180 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
1d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1a0 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
1d1b0 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
1d1c0 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
1d1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1e0 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
1d1f0 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
1d200 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
1d210 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d220 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
1d230 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
1d240 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74 62  uct s_x3node *tb
1d250 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
1d260 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
1d270 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
1d280 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
1d290 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
1d2a0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
1d2b0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1d2c0 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
1d2d0 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
1d2e0 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
1d2f0 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
1d300 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
1d310 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  3"..*/.typedef s
1d320 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 7b  truct s_x3node {
1d330 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
1d340 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
1d350 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1d360 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
1d370 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20 20  config *key;    
1d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d390 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73  * The key */.  s
1d3a0 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
1d3b0 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
1d3c0 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
1d3d0 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
1d3e0 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a  ruct s_x3node **
1d3f0 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
1d400 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e  us link */.} x3n
1d410 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
1d420 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
1d430 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
1d440 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
1d450 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
1d460 69 63 20 73 74 72 75 63 74 20 73 5f 78 33 20 2a  ic struct s_x3 *
1d470 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x3a;../* Allocat
1d480 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
1d490 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
1d4a0 64 20 53 74 61 74 65 5f 69 6e 69 74 28 29 7b 0a  d State_init(){.
1d4b0 20 20 69 66 28 20 78 33 61 20 29 20 72 65 74 75    if( x3a ) retu
1d4c0 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74 72  rn;.  x3a = (str
1d4d0 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63  uct s_x3*)malloc
1d4e0 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
1d4f0 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x3) );.  if( x
1d500 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73  3a ){.    x3a->s
1d510 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78  ize = 128;.    x
1d520 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20  3a->count = 0;. 
1d530 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78     x3a->tbl = (x
1d540 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a  3node*)malloc( .
1d550 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 33        (sizeof(x3
1d560 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
1d570 33 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a  3node*))*128 );.
1d580 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62 6c      if( x3a->tbl
1d590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65  ==0 ){.      fre
1d5a0 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78 33  e(x3a);.      x3
1d5b0 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
1d5c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
1d5d0 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20 28       x3a->ht = (
1d5e0 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e  x3node**)&(x3a->
1d5f0 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20  tbl[128]);.     
1d600 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b   for(i=0; i<128;
1d610 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d   i++) x3a->ht[i]
1d620 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1d630 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
1d640 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
1d650 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
1d660 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
1d670 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
1d680 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
1d690 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
1d6a0 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
1d6b0 74 61 74 65 5f 69 6e 73 65 72 74 28 64 61 74 61  tate_insert(data
1d6c0 2c 6b 65 79 29 0a 73 74 72 75 63 74 20 73 74 61  ,key).struct sta
1d6d0 74 65 20 2a 64 61 74 61 3b 0a 73 74 72 75 63 74  te *data;.struct
1d6e0 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a   config *key;.{.
1d6f0 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x3node *np;.  
1d700 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b  int h;.  int ph;
1d710 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29  ..  if( x3a==0 )
1d720 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20   return 0;.  ph 
1d730 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29  = statehash(key)
1d740 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33  ;.  h = ph & (x3
1d750 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1d760 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
1d770 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
1d780 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e    if( statecmp(n
1d790 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
1d7a0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
1d7b0 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
1d7c0 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
1d7d0 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
1d7e0 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
1d7f0 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
1d800 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
1d810 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d820 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
1d830 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
1d840 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61   x3a->count>=x3a
1d850 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
1d860 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
1d870 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
1d880 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
1d890 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  ,size;.    struc
1d8a0 74 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20 20  t s_x3 array;.  
1d8b0 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73    array.size = s
1d8c0 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a 65 2a  ize = x3a->size*
1d8d0 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75  2;.    array.cou
1d8e0 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b  nt = x3a->count;
1d8f0 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d  .    array.tbl =
1d900 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x3node*)malloc
1d910 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28  (.      (sizeof(
1d920 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x3node) + sizeof
1d930 28 78 33 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20  (x3node*))*size 
1d940 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
1d950 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
1d960 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
1d970 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
1d980 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
1d990 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26  ht = (x3node**)&
1d9a0 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d  (array.tbl[size]
1d9b0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1d9c0 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  i<size; i++) arr
1d9d0 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ay.ht[i] = 0;.  
1d9e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 33 61    for(i=0; i<x3a
1d9f0 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  ->count; i++){. 
1da00 20 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f 6c 64       x3node *old
1da10 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20  np, *newnp;.    
1da20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33 61 2d    oldnp = &(x3a-
1da30 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >tbl[i]);.      
1da40 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6f 6c  h = statehash(ol
1da50 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a  dnp->key) & (siz
1da60 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
1da70 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
1da80 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
1da90 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
1daa0 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
1dab0 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
1dac0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
1dad0 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
1dae0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b  ;.      newnp->k
1daf0 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b  ey = oldnp->key;
1db00 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
1db10 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
1db20 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
1db30 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
1db40 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
1db50 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
1db60 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
1db70 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x3a->tbl);.    *
1db80 78 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x3a = array;.  }
1db90 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
1dba0 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
1dbb0 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69   = ph & (x3a->si
1dbc0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
1dbd0 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f  x3a->tbl[x3a->co
1dbe0 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b  unt++]);.  np->k
1dbf0 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e  ey = key;.  np->
1dc00 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
1dc10 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x3a->ht[h] ) 
1dc20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x3a->ht[h]->from
1dc30 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
1dc40 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61    np->next = x3a
1dc50 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e  ->ht[h];.  x3a->
1dc60 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
1dc70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e  ->from = &(x3a->
1dc80 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
1dc90 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
1dca0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1dcb0 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
1dcc0 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
1dcd0 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
1dce0 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
1dcf0 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53  .struct state *S
1dd00 74 61 74 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73  tate_find(key).s
1dd10 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
1dd20 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  y;.{.  int h;.  
1dd30 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69  x3node *np;..  i
1dd40 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75  f( x3a==0 ) retu
1dd50 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61 74  rn 0;.  h = stat
1dd60 65 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 33  ehash(key) & (x3
1dd70 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1dd80 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
1dd90 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
1dda0 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28 6e    if( statecmp(n
1ddb0 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29  p->key,key)==0 )
1ddc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
1ddd0 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
1dde0 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
1ddf0 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
1de00 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61 79   Return an array
1de10 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
1de20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65 20  all data in the 
1de30 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72  table..** The ar
1de40 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ray is obtained 
1de50 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65  from malloc.  Re
1de60 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d  turn NULL if mem
1de70 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
1de80 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69  * problems, or i
1de90 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20 65  f the array is e
1dea0 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20  mpty. */.struct 
1deb0 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61 72  state **State_ar
1dec0 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75  rayof().{.  stru
1ded0 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61 79  ct state **array
1dee0 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a  ;.  int i,size;.
1def0 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72    if( x3a==0 ) r
1df00 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20  eturn 0;.  size 
1df10 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x3a->count;.  
1df20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20  array = (struct 
1df30 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c 6f 63 28  state **)malloc(
1df40 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
1df50 74 61 74 65 20 2a 29 2a 73 69 7a 65 20 29 3b 0a  tate *)*size );.
1df60 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20    if( array ){. 
1df70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
1df80 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69  ze; i++) array[i
1df90 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e  ] = x3a->tbl[i].
1dfa0 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75  data;.  }.  retu
1dfb0 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20  rn array;.}../* 
1dfc0 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72 61  Hash a configura
1dfd0 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  tion */.PRIVATE 
1dfe0 69 6e 74 20 63 6f 6e 66 69 67 68 61 73 68 28 61  int confighash(a
1dff0 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
1e000 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b  *a;.{.  int h=0;
1e010 0a 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61  .  h = h*571 + a
1e020 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b  ->rp->index*37 +
1e030 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72   a->dot;.  retur
1e040 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65  n h;.}../* There
1e050 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
1e060 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1e070 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  g structure for 
1e080 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74  each.** associat
1e090 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
1e0a0 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63  e "x4"..*/.struc
1e0b0 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73  t s_x4 {.  int s
1e0c0 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1e0d0 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
1e0e0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c   of available sl
1e0f0 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ots. */.        
1e100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e110 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61    /*   Must be a
1e120 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
1e130 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20  ter than or */. 
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e150 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71           /*   eq
1e160 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e  ual to 1 */.  in
1e170 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20  t count;        
1e180 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e190 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f  of currently slo
1e1a0 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73  ts filled */.  s
1e1b0 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
1e1c0 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  tbl;  /* The dat
1e1d0 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f  a stored here */
1e1e0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
1e1f0 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73  de **ht;  /* Has
1e200 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b  h table for look
1e210 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68  ups */.};../* Th
1e220 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
1e230 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
1e240 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20  cture for every 
1e250 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20  data element.** 
1e260 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76  in an associativ
1e270 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
1e280 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  "x4"..*/.typedef
1e290 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
1e2a0 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66   {.  struct conf
1e2b0 69 67 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  ig *data;       
1e2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e2d0 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
1e2e0 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78  ct s_x4node *nex
1e2f0 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
1e300 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
1e310 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
1e320 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x4node **fro
1e330 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
1e340 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65  link */.} x4node
1e350 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
1e360 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
1e370 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
1e380 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
1e390 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
1e3a0 73 74 72 75 63 74 20 73 5f 78 34 20 2a 78 34 61  struct s_x4 *x4a
1e3b0 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
1e3c0 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
1e3d0 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43   array */.void C
1e3e0 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28  onfigtable_init(
1e3f0 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20 72  ){.  if( x4a ) r
1e400 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28  eturn;.  x4a = (
1e410 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c  struct s_x4*)mal
1e420 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
1e430 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69 66  ct s_x4) );.  if
1e440 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34 61  ( x4a ){.    x4a
1e450 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20  ->size = 64;.   
1e460 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x4a->count = 0;
1e470 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20  .    x4a->tbl = 
1e480 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x4node*)malloc(
1e490 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28   .      (sizeof(
1e4a0 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x4node) + sizeof
1e4b0 28 78 34 6e 6f 64 65 2a 29 29 2a 36 34 20 29 3b  (x4node*))*64 );
1e4c0 0a 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74 62  .    if( x4a->tb
1e4d0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
1e4e0 65 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20 78  ee(x4a);.      x
1e4f0 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  4a = 0;.    }els
1e500 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
1e510 20 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d 20        x4a->ht = 
1e520 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d  (x4node**)&(x4a-
1e530 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20  >tbl[64]);.     
1e540 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20   for(i=0; i<64; 
1e550 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20  i++) x4a->ht[i] 
1e560 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
1e570 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
1e580 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
1e590 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
1e5a0 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
1e5b0 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
1e5c0 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
1e5d0 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
1e5e0 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f  ritten */.int Co
1e5f0 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
1e600 28 64 61 74 61 29 0a 73 74 72 75 63 74 20 63 6f  (data).struct co
1e610 6e 66 69 67 20 2a 64 61 74 61 3b 0a 7b 0a 20 20  nfig *data;.{.  
1e620 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e  x4node *np;.  in
1e630 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a  t h;.  int ph;..
1e640 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72    if( x4a==0 ) r
1e650 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
1e660 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61 29  confighash(data)
1e670 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 34  ;.  h = ph & (x4
1e680 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1e690 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
1e6a0 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
1e6b0 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
1e6c0 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d  np->data,data)==
1e6d0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
1e6e0 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
1e6f0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
1e700 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
1e710 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
1e720 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
1e730 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
1e740 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1e750 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
1e760 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
1e770 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x4a->count>=
1e780 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x4a->size ){.   
1e790 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
1e7a0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
1e7b0 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
1e7c0 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74  t i,size;.    st
1e7d0 72 75 63 74 20 73 5f 78 34 20 61 72 72 61 79 3b  ruct s_x4 array;
1e7e0 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
1e7f0 3d 20 73 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69  = size = x4a->si
1e800 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
1e810 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75  count = x4a->cou
1e820 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
1e830 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c  l = (x4node*)mal
1e840 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65  loc(.      (size
1e850 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x4node) + siz
1e860 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 73 69  eof(x4node*))*si
1e870 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72  ze );.    if( ar
1e880 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
1e890 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
1e8a0 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
1e8b0 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
1e8c0 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a  ay.ht = (x4node*
1e8d0 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69  *)&(array.tbl[si
1e8e0 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
1e8f0 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
1e900 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
1e910 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1e920 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x4a->count; i++)
1e930 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20 2a  {.      x4node *
1e940 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
1e950 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
1e960 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  4a->tbl[i]);.   
1e970 20 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73     h = confighas
1e980 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26  h(oldnp->data) &
1e990 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
1e9a0 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
1e9b0 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
1e9c0 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
1e9d0 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
1e9e0 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
1e9f0 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
1ea00 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
1ea10 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
1ea20 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70  np->data = oldnp
1ea30 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65  ->data;.      ne
1ea40 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72  wnp->from = &(ar
1ea50 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20  ray.ht[h]);.    
1ea60 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20    array.ht[h] = 
1ea70 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20  newnp;.    }.   
1ea80 20 66 72 65 65 28 78 34 61 2d 3e 74 62 6c 29 3b   free(x4a->tbl);
1ea90 0a 20 20 20 20 2a 78 34 61 20 3d 20 61 72 72 61  .    *x4a = arra
1eaa0 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65  y;.  }.  /* Inse
1eab0 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20  rt the new data 
1eac0 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  */.  h = ph & (x
1ead0 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
1eae0 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 78  p = &(x4a->tbl[x
1eaf0 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20  4a->count++]);. 
1eb00 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
1eb10 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e 68 74 5b  ;.  if( x4a->ht[
1eb20 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b 68 5d 2d  h] ) x4a->ht[h]-
1eb30 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
1eb40 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
1eb50 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x4a->ht[h];.  
1eb60 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x4a->ht[h] = np;
1eb70 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
1eb80 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x4a->ht[h]);.  r
1eb90 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
1eba0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1ebb0 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
1ebc0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
1ebd0 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
1ebe0 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
1ebf0 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  y. */.struct con
1ec00 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65  fig *Configtable
1ec10 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74 72 75 63  _find(key).struc
1ec20 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b  t config *key;.{
1ec30 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f  .  int h;.  x4no
1ec40 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
1ec50 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  4a==0 ) return 0
1ec60 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61  ;.  h = configha
1ec70 73 68 28 6b 65 79 29 20 26 20 28 78 34 61 2d 3e  sh(key) & (x4a->
1ec80 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
1ec90 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x4a->ht[h];.  wh
1eca0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
1ecb0 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 6e 70 2d  f( Configcmp(np-
1ecc0 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20  >data,key)==0 ) 
1ecd0 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20  break;.    np = 
1ece0 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
1ecf0 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e  return np ? np->
1ed00 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20  data : 0;.}../* 
1ed10 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61 20  Remove all data 
1ed20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e 20  from the table. 
1ed30 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61 20   Pass each data 
1ed40 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
1ed50 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73 20  "f".** as it is 
1ed60 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20 6d  removed.  ("f" m
1ed70 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76  ay be null to av
1ed80 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29 20  oid this step.) 
1ed90 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  */.void Configta
1eda0 62 6c 65 5f 63 6c 65 61 72 28 66 29 0a 69 6e 74  ble_clear(f).int
1edb0 28 2a 66 29 28 2f 2a 20 73 74 72 75 63 74 20 63  (*f)(/* struct c
1edc0 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 7b 0a 20  onfig * */);.{. 
1edd0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 78 34   int i;.  if( x4
1ede0 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e 63 6f 75  a==0 || x4a->cou
1edf0 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  nt==0 ) return;.
1ee00 20 20 69 66 28 20 66 20 29 20 66 6f 72 28 69 3d    if( f ) for(i=
1ee10 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b  0; i<x4a->count;
1ee20 20 69 2b 2b 29 20 28 2a 66 29 28 78 34 61 2d 3e   i++) (*f)(x4a->
1ee30 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a 20 20  tbl[i].data);.  
1ee40 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e  for(i=0; i<x4a->
1ee50 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34 61 2d 3e  size; i++) x4a->
1ee60 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 78 34 61  ht[i] = 0;.  x4a
1ee70 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 72  ->count = 0;.  r
1ee80 65 74 75 72 6e 3b 0a 7d 0a                       eturn;.}.