/*
Derived from Inferno's utils/iyacc/yacc.c
http://code.google.com/p/inferno-os/source/browse/utils/iyacc/yacc.c

This copyright NOTICE applies to all files in this directory and
subdirectories, unless another copyright notice appears in a given
file or subdirectory.  If you take substantial code from this software to use in
other programs, you must somehow include with it an appropriate
copyright notice that includes the copyright notice and the other
notices below.  It is fine (and often tidier) to do that in a separate
file such as NOTICE, LICENCE or COPYING.

	Copyright © 1994-1999 Lucent Technologies Inc.  All rights reserved.
	Portions Copyright © 1995-1997 C H Forsyth (forsyth@terzarima.net)
	Portions Copyright © 1997-1999 Vita Nuova Limited
	Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com)
	Portions Copyright © 2004,2006 Bruce Ellis
	Portions Copyright © 2005-2007 C H Forsyth (forsyth@terzarima.net)
	Revisions Copyright © 2000-2007 Lucent Technologies Inc. and others
	Portions Copyright © 2009 The Go Authors.  All rights reserved.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
*/

package main

// yacc
// major difference is lack of stem ("y" variable)
//

import (
	"flag";
	"fmt";
	"bufio";
	"os";
)

// the following are adjustable
// according to memory size
const (
	ACTSIZE		= 30000;
	NSTATES		= 2000;
	TEMPSIZE	= 2000;

	SYMINC		= 50;	// increase for non-term or term
	RULEINC		= 50;	// increase for max rule length prodptr[i]
	PRODINC		= 100;	// increase for productions     prodptr
	WSETINC		= 50;	// increase for working sets    wsets
	STATEINC	= 200;	// increase for states          statemem

	NAMESIZE	= 50;
	NTYPES		= 63;
	ISIZE		= 400;

	PRIVATE	= 0xE000;	// unicode private use

	// relationships which must hold:
	//	TEMPSIZE >= NTERMS + NNONTERM + 1;
	//	TEMPSIZE >= NSTATES;
	//

	NTBASE		= 010000;
	ERRCODE		= 8190;
	ACCEPTCODE	= 8191;
	YYLEXUNK	= 3;
	TOKSTART	= 4;	//index of first defined token
)

// no, left, right, binary assoc.
const (
	NOASC	= iota;
	LASC;
	RASC;
	BASC;
)

// flags for state generation
const (
	DONE	= iota;
	MUSTDO;
	MUSTLOOKAHEAD;
)

// flags for a rule having an action, and being reduced
const (
	ACTFLAG	= 1<<(iota+2);
	REDFLAG;
)

// output parser flags
const YYFLAG = -1000

// parse tokens
const (
	IDENTIFIER	= PRIVATE+iota;
	MARK;
	TERM;
	LEFT;
	RIGHT;
	BINARY;
	PREC;
	LCURLY;
	IDENTCOLON;
	NUMBER;
	START;
	TYPEDEF;
	TYPENAME;
	UNION;
)

const ENDFILE = 0
const EMPTY = 1
const WHOKNOWS = 0
const OK = 1
const NOMORE = -1000

// macros for getting associativity and precedence levels
func ASSOC(i int) int {
	return i&3;
}

func PLEVEL(i int) int {
	return (i>>4)&077;
}

func TYPE(i int) int {
	return (i>>10)&077;
}

// macros for setting associativity and precedence levels
func SETASC(i, j int) int {
	return i|j;
}

func SETPLEV(i, j int) int {
	return i|(j<<4);
}

func SETTYPE(i, j int) int {
	return i|(j<<10);
}

// I/O descriptors
var finput *bufio.Reader	// input file
var stderr *bufio.Writer
var ftable *bufio.Writer	// y.go file
var foutput *bufio.Writer	// y.output file

var oflag string	// -o [y.go]		- y.go file
var vflag string	// -v [y.output]	- y.output file
var lflag bool		// -l			- disable line directives

var stacksize = 200

// communication variables between various I/O routines
var infile string	// input file name
var numbval int		// value of an input number
var tokname string	// input token name, slop for runes and 0
var tokflag = false

// structure declarations
type Lkset []int

type Pitem struct {
	prod	[]int;
	off	int;	// offset within the production
	first	int;	// first term or non-term in item
	prodno	int;	// production number for sorting
}

type Item struct {
	pitem	Pitem;
	look	Lkset;
}

type Symb struct {
	name	string;
	value	int;
}

type Wset struct {
	pitem	Pitem;
	flag	int;
	ws	Lkset;
}

// storage of types
var ntypes int			// number of types defined
var typeset [NTYPES]string	// pointers to type tags

// token information

var ntokens = 0	// number of tokens
var tokset []Symb
var toklev []int	// vector with the precedence of the terminals

// nonterminal information

var nnonter = -1	// the number of nonterminals
var nontrst []Symb
var start int	// start symbol

// state information

var nstate = 0				// number of states
var pstate = make([]int, NSTATES+2)	// index into statemem to the descriptions of the states
var statemem []Item
var tystate = make([]int, NSTATES)	// contains type information about the states
var tstates []int			// states generated by terminal gotos
var ntstates []int			// states generated by nonterminal gotos
var mstates = make([]int, NSTATES)	// chain of overflows of term/nonterm generation lists
var lastred int				// number of last reduction of a state
var defact = make([]int, NSTATES)	// default actions of states

// lookahead set information

var lkst []Lkset
var nolook = 0	// flag to turn off lookahead computations
var tbitset = 0	// size of lookahead sets
var clset Lkset	// temporary storage for lookahead computations

// working set information

var wsets []Wset
var cwp int

// storage for action table

var amem []int				// action table storage
var memp int				// next free action table position
var indgo = make([]int, NSTATES)	// index to the stored goto table

// temporary vector, indexable by states, terms, or ntokens

var temp1 = make([]int, TEMPSIZE)	// temporary storage, indexed by terms + ntokens or states
var lineno = 1				// current input line number
var fatfl = 1				// if on, error is fatal
var nerrors = 0				// number of errors

// assigned token type values

var extval = 0

// grammar rule information

var nprod = 1		// number of productions
var prdptr [][]int	// pointers to descriptions of productions
var levprd []int	// precedence levels for the productions
var rlines []int	// line number for this rule

// statistics collection variables

var zzgoent = 0
var zzgobest = 0
var zzacent = 0
var zzexcp = 0
var zzclose = 0
var zzrrconf = 0
var zzsrconf = 0
var zzstate = 0

// optimizer arrays

var yypgo [][]int
var optst [][]int
var ggreed []int
var pgo []int

var maxspr int	// maximum spread of any entry
var maxoff int	// maximum offset into a array
var maxa int

// storage for information about the nonterminals

var pres [][][]int	// vector of pointers to productions yielding each nonterminal
var pfirst []Lkset
var pempty []int	// vector of nonterminals nontrivially deriving e

// random stuff picked out from between functions

var indebug = 0	// debugging flag for cpfir
var pidebug = 0	// debugging flag for putitem
var gsdebug = 0	// debugging flag for stagen
var cldebug = 0	// debugging flag for closure
var pkdebug = 0	// debugging flag for apack
var g2debug = 0	// debugging for go2gen
var adb = 0	// debugging for callopt

type Resrv struct {
	name	string;
	value	int;
}

var resrv = []Resrv{
	Resrv{"binary", BINARY},
	Resrv{"left", LEFT},
	Resrv{"nonassoc", BINARY},
	Resrv{"prec", PREC},
	Resrv{"right", RIGHT},
	Resrv{"start", START},
	Resrv{"term", TERM},
	Resrv{"token", TERM},
	Resrv{"type", TYPEDEF},
	Resrv{"union", UNION},
	Resrv{"struct", UNION},
}

var zznewstate = 0

const EOF = -1
const UTFmax = 0x3f

func main() {

	setup();	// initialize and read productions

	tbitset = (ntokens+32)/32;
	cpres();	// make table of which productions yield a given nonterminal
	cempty();	// make a table of which nonterminals can match the empty string
	cpfir();	// make a table of firsts of nonterminals

	stagen();	// generate the states

	yypgo = make([][]int, nnonter+1);
	optst = make([][]int, nstate);
	output();	// write the states and the tables
	go2out();

	hideprod();
	summary();

	callopt();

	others();

	exit(0);
}

func setup() {
	var j, ty int;

	stderr = bufio.NewWriter(os.NewFile(2, "stderr"));
	foutput = nil;

	flag.StringVar(&oflag, "o", "", "parser output");
	flag.StringVar(&vflag, "v", "", "create parsing tables");
	flag.BoolVar(&lflag, "l", false, "disable line directives");

	flag.Parse();
	if flag.NArg() != 1 {
		usage();
	}
	if stacksize < 1 {
		// never set so cannot happen
		fmt.Fprintf(stderr, "yacc: stack size too small\n");
		usage();
	}
	openup();

	defin(0, "$end");
	extval = PRIVATE;	// tokens start in unicode 'private use'
	defin(0, "error");
	defin(1, "$accept");
	defin(0, "$unk");
	i := 0;

	t := gettok();

outer:
	for {
		switch t {
		default:
			error("syntax error tok=%v", t-PRIVATE);

		case MARK, ENDFILE:
			break outer;

		case ';':

		case START:
			t = gettok();
			if t != IDENTIFIER {
				error("bad %%start construction");
			}
			start = chfind(1, tokname);

		case TYPEDEF:
			t = gettok();
			if t != TYPENAME {
				error("bad syntax in %%type");
			}
			ty = numbval;
			for {
				t = gettok();
				switch t {
				case IDENTIFIER:
					t = chfind(1, tokname);
					if t < NTBASE {
						j = TYPE(toklev[t]);
						if j != 0 && j != ty {
							error("type redeclaration of token ",
								tokset[t].name);
						} else {
							toklev[t] = SETTYPE(toklev[t], ty);
						}
					} else {
						j = nontrst[t-NTBASE].value;
						if j != 0 && j != ty {
							error("type redeclaration of nonterminal %v",
								nontrst[t-NTBASE].name);
						} else {
							nontrst[t-NTBASE].value = ty;
						}
					}
					continue;

				case ',':
					continue;
				}
				break;
			}
			continue;

		case UNION:
			cpyunion();

		case LEFT, BINARY, RIGHT, TERM:
			// nonzero means new prec. and assoc.
			lev := t-TERM;
			if lev != 0 {
				i++;
			}
			ty = 0;

			// get identifiers so defined
			t = gettok();

			// there is a type defined
			if t == TYPENAME {
				ty = numbval;
				t = gettok();
			}
			for {
				switch t {
				case ',':
					t = gettok();
					continue;

				case ';':
					break;

				case IDENTIFIER:
					j = chfind(0, tokname);
					if j >= NTBASE {
						error("%v defined earlier as nonterminal", tokname);
					}
					if lev != 0 {
						if ASSOC(toklev[j]) != 0 {
							error("redeclaration of precedence of %v", tokname);
						}
						toklev[j] = SETASC(toklev[j], lev);
						toklev[j] = SETPLEV(toklev[j], i);
					}
					if ty != 0 {
						if TYPE(toklev[j]) != 0 {
							error("redeclaration of type of %v", tokname);
						}
						toklev[j] = SETTYPE(toklev[j], ty);
					}
					t = gettok();
					if t == NUMBER {
						tokset[j].value = numbval;
						t = gettok();
					}

					continue;
				}
				break;
			}
			continue;

		case LCURLY:
			cpycode();
		}
		t = gettok();
	}

	if t == ENDFILE {
		error("unexpected EOF before %%");
	}

	// put out non-literal terminals
	for i := TOKSTART; i <= ntokens; i++ {
		// non-literals
		c := tokset[i].name[0];
		if c != ' ' && c != '$' {
			fmt.Fprintf(ftable, "const\t%v\t= %v\n", tokset[i].name, tokset[i].value);
		}
	}

	// put out names of token names
	fmt.Fprintf(ftable, "var\tToknames\t =[]string {\n");
	for i := TOKSTART; i <= ntokens; i++ {
		fmt.Fprintf(ftable, "\t\"%v\",\n", tokset[i].name);
	}
	fmt.Fprintf(ftable, "}\n");

	// put out names of state names
	fmt.Fprintf(ftable, "var\tStatenames\t =[]string {\n");
	//	for i:=TOKSTART; i<=ntokens; i++ {
	//		fmt.Fprintf(ftable, "\t\"%v\",\n", tokset[i].name);
	//	}
	fmt.Fprintf(ftable, "}\n");

	fmt.Fprintf(ftable, "\nfunc\n");
	fmt.Fprintf(ftable, "yyrun(p int, yypt int) {\n");
	fmt.Fprintf(ftable, "switch p {\n");

	moreprod();
	prdptr[0] = []int{NTBASE, start, 1, 0};

	nprod = 1;
	curprod := make([]int, RULEINC);
	t = gettok();
	if t != IDENTCOLON {
		error("bad syntax on first rule");
	}

	if start == 0 {
		prdptr[0][1] = chfind(1, tokname);
	}

	// read rules
	// put into prdptr array in the format
	// target
	// followed by id's of terminals and non-terminals
	// followd by -nprod

	for t != MARK && t != ENDFILE {
		mem := 0;

		// process a rule
		rlines[nprod] = lineno;
		if t == '|' {
			curprod[mem] = prdptr[nprod-1][0];
			mem++;
		} else if t == IDENTCOLON {
			curprod[mem] = chfind(1, tokname);
			if curprod[mem] < NTBASE {
				error("token illegal on LHS of grammar rule");
			}
			mem++;
		} else {
			error("illegal rule: missing semicolon or | ?");
		}

		// read rule body
		t = gettok();
		for {
			for t == IDENTIFIER {
				curprod[mem] = chfind(1, tokname);
				if curprod[mem] < NTBASE {
					levprd[nprod] = toklev[curprod[mem]];
				}
				mem++;
				if mem >= len(curprod) {
					ncurprod := make([]int, mem+RULEINC);
					for ll := 0; ll < mem; ll++ {
						ncurprod[ll] = curprod[ll];
					}
					curprod = ncurprod;
				}
				t = gettok();
			}
			if t == PREC {
				if gettok() != IDENTIFIER {
					error("illegal %%prec syntax");
				}
				j = chfind(2, tokname);
				if j >= NTBASE {
					error("nonterminal " + nontrst[j-NTBASE].name + " illegal after %%prec");
				}
				levprd[nprod] = toklev[j];
				t = gettok();
			}
			if t != '=' {
				break;
			}
			levprd[nprod] |= ACTFLAG;
			fmt.Fprintf(ftable, "\ncase %v:", nprod);
			cpyact(curprod, mem);

			// action within rule...
			t = gettok();
			if t == IDENTIFIER {
				// make it a nonterminal
				j = chfind(1, fmt.Sprintf("$$%v", nprod));

				//
				// the current rule will become rule number nprod+1
				// enter null production for action
				//
				prdptr[nprod] = make([]int, 2);
				prdptr[nprod][0] = j;
				prdptr[nprod][1] = -nprod;

				// update the production information
				nprod++;
				moreprod();
				levprd[nprod] = levprd[nprod-1] & ^ACTFLAG;
				levprd[nprod-1] = ACTFLAG;
				rlines[nprod] = lineno;

				// make the action appear in the original rule
				curprod[mem] = j;
				mem++;
				if mem >= len(curprod) {
					ncurprod := make([]int, mem+RULEINC);
					for ll := 0; ll < mem; ll++ {
						ncurprod[ll] = curprod[ll];
					}
					curprod = ncurprod;
				}
			}
		}

		for t == ';' {
			t = gettok();
		}
		curprod[mem] = -nprod;
		mem++;

		// check that default action is reasonable
		if ntypes != 0 && (levprd[nprod]&ACTFLAG) == 0 &&
			nontrst[curprod[0]-NTBASE].value != 0 {
			// no explicit action, LHS has value
			tempty := curprod[1];
			if tempty < 0 {
				error("must return a value, since LHS has a type");
			}
			if tempty >= NTBASE {
				tempty = nontrst[tempty-NTBASE].value;
			} else {
				tempty = TYPE(toklev[tempty]);
			}
			if tempty != nontrst[curprod[0]-NTBASE].value {
				error("default action causes potential type clash");
			}
			fmt.Fprintf(ftable, "\ncase %v:", nprod);
			fmt.Fprintf(ftable, "\n\tYYVAL.%v = YYS[yypt-0].%v;",
				typeset[tempty], typeset[tempty]);
		}
		moreprod();
		prdptr[nprod] = make([]int, mem);
		for ll := 0; ll < mem; ll++ {
			prdptr[nprod][ll] = curprod[ll];
		}
		nprod++;
		moreprod();
		levprd[nprod] = 0;
	}

	//
	// end of all rules
	// dump out the prefix code
	//

	fmt.Fprintf(ftable, "\n\t}");
	fmt.Fprintf(ftable, "\n}\n");

	fmt.Fprintf(ftable, "const	YYEOFCODE	= 1\n");
	fmt.Fprintf(ftable, "const	YYERRCODE	= 2\n");
	fmt.Fprintf(ftable, "const	YYMAXDEPTH	= %v\n", stacksize);

	//
	// copy any postfix code
	//
	if t == MARK {
		if !lflag {
			fmt.Fprintf(ftable, "\n//line %v:%v\n", infile, lineno);
		}
		for {
			c := getrune(finput);
			if c == EOF {
				break;
			}
			putrune(ftable, c);
		}
	}
}

//
// allocate enough room to hold another production
//
func moreprod() {
	n := len(prdptr);
	if nprod >= n {
		nn := n+PRODINC;
		aprod := make([][]int, nn);
		alevprd := make([]int, nn);
		arlines := make([]int, nn);

		for ll := 0; ll < n; ll++ {
			aprod[ll] = prdptr[ll];
			alevprd[ll] = levprd[ll];
			arlines[ll] = rlines[ll];
		}

		prdptr = aprod;
		levprd = alevprd;
		rlines = arlines;
	}
}

//
// define s to be a terminal if t=0
// or a nonterminal if t=1
//
func defin(nt int, s string) int {
	val := 0;
	if nt != 0 {
		nnonter++;
		if nnonter >= len(nontrst) {
			anontrst := make([]Symb, nnonter+SYMINC);
			for ll := 0; ll < len(nontrst); ll++ {
				anontrst[ll] = nontrst[ll];
			}
			nontrst = anontrst;
		}
		nontrst[nnonter] = Symb{s, 0};
		return NTBASE+nnonter;
	}

	// must be a token
	ntokens++;
	if ntokens >= len(tokset) {
		nn := ntokens+SYMINC;
		atokset := make([]Symb, nn);
		atoklev := make([]int, nn);

		for ll := 0; ll < len(tokset); ll++ {
			atoklev[ll] = toklev[ll];
			atokset[ll] = tokset[ll];
		}

		tokset = atokset;
		toklev = atoklev;
	}
	tokset[ntokens].name = s;
	toklev[ntokens] = 0;

	// establish value for token
	// single character literal
	if s[0] == ' ' && len(s) == 1+1 {
		val = int(s[1]);
	} else if s[0] == ' ' && s[1] == '\\' {	// escape sequence
		if len(s) == 2+1 {
			// single character escape sequence
			switch s[2] {
			case '\'':
				val = '\'';
			case '"':
				val = '"';
			case '\\':
				val = '\\';
			case 'a':
				val = '\a';
			case 'b':
				val = '\b';
			case 'n':
				val = '\n';
			case 'r':
				val = '\r';
			case 't':
				val = '\t';
			case 'v':
				val = '\v';
			default:
				error("invalid escape %v", s[1:3]);
			}
		} else if s[2] == 'u' && len(s) == 2+1+4 {	// \unnnn sequence
			val = 0;
			s = s[3:len(s)];
			for s != "" {
				c := int(s[0]);
				switch {
				case c >= '0' && c <= '9':
					c -= '0';
				case c >= 'a' && c <= 'f':
					c -= 'a'-10;
				case c >= 'A' && c <= 'F':
					c -= 'A'-10;
				default:
					error("illegal \\unnnn construction");
				}
				val = val*16 + c;
				s = s[1:len(s)];
			}
			if val == 0 {
				error("'\\u0000' is illegal");
			}
		} else {
			error("unknown escape");
		}
	} else {
		val = extval;
		extval++;
	}

	tokset[ntokens].value = val;
	return ntokens;
}

var peekline = 0

func gettok() int {
	var i, match, c int;

	tokname = "";
	for {
		lineno += peekline;
		peekline = 0;
		c = getrune(finput);
		for c == ' ' || c == '\n' || c == '\t' || c == '\v' || c == '\r' {
			if c == '\n' {
				lineno++;
			}
			c = getrune(finput);
		}

		// skip comment -- fix
		if c != '/' {
			break;
		}
		lineno += skipcom();
	}

	switch c {
	case EOF:
		if tokflag {
			fmt.Printf(">>> ENDFILE %v\n", lineno);
		}
		return ENDFILE;

	case '{':
		ungetrune(finput, c);
		if tokflag {
			fmt.Printf(">>> ={ %v\n", lineno);
		}
		return '=';

	case '<':
		// get, and look up, a type name (union member name)
		c = getrune(finput);
		for c != '>' && c != EOF && c != '\n' {
			tokname += string(c);
			c = getrune(finput);
		}

		if c != '>' {
			error("unterminated < ... > clause");
		}

		for i = 1; i <= ntypes; i++ {
			if typeset[i] == tokname {
				numbval = i;
				if tokflag {
					fmt.Printf(">>> TYPENAME old <%v> %v\n", tokname, lineno);
				}
				return TYPENAME;
			}
		}
		ntypes++;
		numbval = ntypes;
		typeset[numbval] = tokname;
		if tokflag {
			fmt.Printf(">>> TYPENAME new <%v> %v\n", tokname, lineno);
		}
		return TYPENAME;

	case '"', '\'':
		match = c;
		tokname = " ";
		for {
			c = getrune(finput);
			if c == '\n' || c == EOF {
				error("illegal or missing ' or \"");
			}
			if c == '\\' {
				tokname += string('\\');
				c = getrune(finput);
			} else if c == match {
				if tokflag {
					fmt.Printf(">>> IDENTIFIER \"%v\" %v\n", tokname, lineno);
				}
				return IDENTIFIER;
			}
			tokname += string(c);
		}

	case '%':
		c = getrune(finput);
		switch c {
		case '%':
			if tokflag {
				fmt.Printf(">>> MARK %%%% %v\n", lineno);
			}
			return MARK;
		case '=':
			if tokflag {
				fmt.Printf(">>> PREC %%= %v\n", lineno);
			}
			return PREC;
		case '{':
			if tokflag {
				fmt.Printf(">>> LCURLY %%{ %v\n", lineno);
			}
			return LCURLY;
		}

		getword(c);
		// find a reserved word
		for c = 0; c < len(resrv); c++ {
			if tokname == resrv[c].name {
				if tokflag {
					fmt.Printf(">>> %%%v %v %v\n", tokname,
						resrv[c].value - PRIVATE, lineno);
				}
				return resrv[c].value;
			}
		}
		error("invalid escape, or illegal reserved word: %v", tokname);

	case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
		numbval = c-'0';
		for {
			c = getrune(finput);
			if !isdigit(c) {
				break;
			}
			numbval = numbval*10 + c - '0';
		}
		ungetrune(finput, c);
		if tokflag {
			fmt.Printf(">>> NUMBER %v %v\n", numbval, lineno);
		}
		return NUMBER;

	default:
		if isword(c) || c == '.' || c == '$' {
			getword(c);
			break;
		}
		if tokflag {
			fmt.Printf(">>> OPERATOR %v %v\n", string(c), lineno);
		}
		return c;
	}

	// look ahead to distinguish IDENTIFIER from IDENTCOLON
	c = getrune(finput);
	for c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\r' || c == '/' {
		if c == '\n' {
			peekline++;
		}
		// look for comments
		if c == '/' {
			peekline += skipcom();
		}
		c = getrune(finput);
	}
	if c == ':' {
		if tokflag {
			fmt.Printf(">>> IDENTCOLON %v: %v\n", tokname, lineno);
		}
		return IDENTCOLON;
	}

	ungetrune(finput, c);
	if tokflag {
		fmt.Printf(">>> IDENTIFIER %v %v\n", tokname, lineno);
	}
	return IDENTIFIER;
}

func getword(c int) {
	tokname = "";
	for isword(c) || isdigit(c) || c == '_' || c == '.' || c == '$' {
		tokname += string(c);
		c = getrune(finput);
	}
	ungetrune(finput, c);
}

//
// determine the type of a symbol
//
func fdtype(t int) int {
	var v int;
	var s string;

	if t >= NTBASE {
		v = nontrst[t-NTBASE].value;
		s = nontrst[t-NTBASE].name;
	} else {
		v = TYPE(toklev[t]);
		s = tokset[t].name;
	}
	if v <= 0 {
		error("must specify type for %v", s);
	}
	return v;
}

func chfind(t int, s string) int {
	if s[0] == ' ' {
		t = 0;
	}
	for i := 0; i <= ntokens; i++ {
		if s == tokset[i].name {
			return i;
		}
	}
	for i := 0; i <= nnonter; i++ {
		if s == nontrst[i].name {
			return NTBASE+i;
		}
	}

	// cannot find name
	if t > 1 {
		error("%v should have been defined earlier", s);
	}
	return defin(t, s);
}

//
// copy the union declaration to the output, and the define file if present
//
func cpyunion() {

	if !lflag {
		fmt.Fprintf(ftable, "\n//line %v %v\n", lineno, infile);
	}
	fmt.Fprintf(ftable, "type\tYYSTYPE\tstruct");

	level := 0;

out:
	for {
		c := getrune(finput);
		if c == EOF {
			error("EOF encountered while processing %%union");
		}
		putrune(ftable, c);
		switch c {
		case '\n':
			lineno++;
		case '{':
			if level == 0 {
				fmt.Fprintf(ftable, "\n\tyys\tint;");
			}
			level++;
		case '}':
			level--;
			if level == 0 {
				break out;
			}
		}
	}
	fmt.Fprintf(ftable, "\n");
	fmt.Fprintf(ftable, "var\tyylval\tYYSTYPE\n");
	fmt.Fprintf(ftable, "var\tYYVAL\tYYSTYPE\n");
	fmt.Fprintf(ftable, "var\tYYS\t[%v]YYSTYPE\n", stacksize);
}

//
// saves code between %{ and %}
//
func cpycode() {
	lno := lineno;

	c := getrune(finput);
	if c == '\n' {
		c = getrune(finput);
		lineno++;
	}
	if !lflag {
		fmt.Fprintf(ftable, "\n//line %v %v\n", lineno, infile);
	}
	for c != EOF {
		if c == '%' {
			c = getrune(finput);
			if c == '}' {
				return;
			}
			putrune(ftable, '%');
		}
		putrune(ftable, c);
		if c == '\n' {
			lineno++;
		}
		c = getrune(finput);
	}
	lineno = lno;
	error("eof before %%}");
}

//func
//addcode(k int, s string)
//{
//	for i := 0; i < len(s); i++ {
//		addcodec(k, int(s[i]));
//	}
//}

//func
//addcodec(k, c int)
//{
//	if codehead == nil || k != codetail.kind || codetail.ndata >= NCode {
//		cd := new(Code);
//		cd.kind = k;
//		cd.data = make([]byte, NCode+UTFmax);
//		cd.ndata = 0;
//		cd.next = nil;
//
//		if codehead == nil {
//			codehead = cd;
//		} else
//			codetail.next = cd;
//		codetail = cd;
//	}
//
////!!	codetail.ndata += sys->char2byte(c, codetail.data, codetail.ndata);
//}

//func
//dumpcode(til int)
//{
//	for ; codehead != nil; codehead = codehead.next {
//		if codehead.kind == til {
//			return;
//		}
//		if write(ftable, codehead.data, codehead.ndata) != codehead.ndata {
//			error("can't write output file");
//		}
//	}
//}

//
// write out the module declaration and any token info
//
//func
//dumpmod()
//{
//
//	for ; codehead != nil; codehead = codehead.next {
//		if codehead.kind != CodeMod {
//			break;
//		}
//		if write(ftable, codehead.data, codehead.ndata) != codehead.ndata {
//			error("can't write output file");
//		}
//	}
//
//	for i:=TOKSTART; i<=ntokens; i++ {
//		// non-literals
//		c := tokset[i].name[0];
//		if c != ' ' && c != '$' {
//			fmt.Fprintf(ftable, "vonst	%v	%v\n",
//				tokset[i].name, tokset[i].value);
//		}
//	}
//
//}

//
// skip over comments
// skipcom is called after reading a '/'
//
func skipcom() int {
	var c int;

	c = getrune(finput);
	if c == '/' {
		for c != EOF {
			if c == '\n' {
				return 1;
			}
			c = getrune(finput);
		}
		error("EOF inside comment");
		return 0;
	}
	if c != '*' {
		error("illegal comment");
	}

	nl := 0;	// lines skipped
	c = getrune(finput);

l1:
	switch c {
	case '*':
		c = getrune(finput);
		if c == '/' {
			break;
		}
		goto l1;

	case '\n':
		nl++;
		fallthrough;

	default:
		c = getrune(finput);
		goto l1;
	}
	return nl;
}

func dumpprod(curprod []int, max int) {
	fmt.Printf("\n");
	for i := 0; i < max; i++ {
		p := curprod[i];
		if p < 0 {
			fmt.Printf("[%v] %v\n", i, p);
		} else {
			fmt.Printf("[%v] %v\n", i, symnam(p));
		}
	}
}

//
// copy action to the next ; or closing }
//
func cpyact(curprod []int, max int) {

	if !lflag {
		fmt.Fprintf(ftable, "\n//line %v %v\n", lineno, infile);
	}

	lno := lineno;
	brac := 0;

loop:
	for {
		c := getrune(finput);

	swt:
		switch c {
		case ';':
			if brac == 0 {
				putrune(ftable, c);
				return;
			}

		case '{':
			if brac == 0 {
			}
			putrune(ftable, '\t');
			brac++;

		case '$':
			s := 1;
			tok := -1;
			c = getrune(finput);

			// type description
			if c == '<' {
				ungetrune(finput, c);
				if gettok() != TYPENAME {
					error("bad syntax on $<ident> clause");
				}
				tok = numbval;
				c = getrune(finput);
			}
			if c == '$' {
				fmt.Fprintf(ftable, "YYVAL");

				// put out the proper tag...
				if ntypes != 0 {
					if tok < 0 {
						tok = fdtype(curprod[0]);
					}
					fmt.Fprintf(ftable, ".%v", typeset[tok]);
				}
				continue loop;
			}
			if c == '-' {
				s = -s;
				c = getrune(finput);
			}
			j := 0;
			if isdigit(c) {
				for isdigit(c) {
					j = j*10 + c - '0';
					c = getrune(finput);
				}
				ungetrune(finput, c);
				j = j*s;
				if j >= max {
					error("Illegal use of $%v", j);
				}
			} else if isword(c) || c == '_' || c == '.' {
				// look for $name
				ungetrune(finput, c);
				if gettok() != IDENTIFIER {
					error("$ must be followed by an identifier");
				}
				tokn := chfind(2, tokname);
				fnd := -1;
				c = getrune(finput);
				if c != '@' {
					ungetrune(finput, c);
				} else if gettok() != NUMBER {
					error("@ must be followed by number");
				} else {
					fnd = numbval;
				}
				for j = 1; j < max; j++ {
					if tokn == curprod[j] {
						fnd--;
						if fnd <= 0 {
							break;
						}
					}
				}
				if j >= max {
					error("$name or $name@number not found");
				}
			} else {
				putrune(ftable, '$');
				if s < 0 {
					putrune(ftable, '-');
				}
				ungetrune(finput, c);
				continue loop;
			}
			fmt.Fprintf(ftable, "YYS[yypt-%v]", max-j-1);

			// put out the proper tag
			if ntypes != 0 {
				if j <= 0 && tok < 0 {
					error("must specify type of $%v", j);
				}
				if tok < 0 {
					tok = fdtype(curprod[j]);
				}
				fmt.Fprintf(ftable, ".%v", typeset[tok]);
			}
			continue loop;

		case '}':
			brac--;
			if brac != 0 {
				break;
			}
			putrune(ftable, c);
			return;

		case '/':
			// a comment
			putrune(ftable, c);
			c = getrune(finput);
			for c != EOF {
				if c == '\n' {
					lineno++;
					break swt;
				}
				putrune(ftable, c);
				c = getrune(finput);
			}
			error("EOF inside comment");

		case '\'', '"':
			// character string or constant
			match := c;
			putrune(ftable, c);
			c = getrune(finput);
			for c != EOF {
				if c == '\\' {
					putrune(ftable, c);
					c = getrune(finput);
					if c == '\n' {
						lineno++;
					}
				} else if c == match {
					break swt;
				}
				if c == '\n' {
					error("newline in string or char const");
				}
				putrune(ftable, c);
				c = getrune(finput);
			}
			error("EOF in string or character constant");

		case EOF:
			lineno = lno;
			error("action does not terminate");

		case '\n':
			lineno++;
		}

		putrune(ftable, c);
	}
}

func openup() {
	infile = flag.Arg(0);
	finput = open(infile);
	if finput == nil {
		error("cannot open %v", infile);
	}

	foutput = nil;
	if vflag != "" {
		foutput = create(vflag, 0666);
		if foutput == nil {
			error("can't create file %v", vflag);
		}
	}

	ftable = nil;
	if oflag == "" {
		oflag = "y.go";
	}
	ftable = create(oflag, 0666);
	if ftable == nil {
		error("can't create file %v", oflag);
	}

}

//
// return a pointer to the name of symbol i
//
func symnam(i int) string {
	var s string;

	if i >= NTBASE {
		s = nontrst[i-NTBASE].name;
	} else {
		s = tokset[i].name;
	}
	if s[0] == ' ' {
		s = s[1:len(s)];
	}
	return s;
}

//
// set elements 0 through n-1 to c
//
func aryfil(v []int, n, c int) {
	for i := 0; i < n; i++ {
		v[i] = c;
	}
}

//
// compute an array with the beginnings of productions yielding given nonterminals
// The array pres points to these lists
// the array pyield has the lists: the total size is only NPROD+1
//
func cpres() {
	pres = make([][][]int, nnonter+1);
	curres := make([][]int, nprod);

	if false {
		for j := 0; j <= nnonter; j++ {
			fmt.Printf("nnonter[%v] = %v\n", j, nontrst[j].name);
		}
		for j := 0; j < nprod; j++ {
			fmt.Printf("prdptr[%v][0] = %v+NTBASE\n", j, prdptr[j][0]-NTBASE);
		}
	}

	fatfl = 0;	// make undefined symbols nonfatal
	for i := 0; i <= nnonter; i++ {
		n := 0;
		c := i+NTBASE;
		for j := 0; j < nprod; j++ {
			if prdptr[j][0] == c {
				curres[n] = prdptr[j][1:len(prdptr[j])];
				n++;
			}
		}
		if n == 0 {
			error("nonterminal %v not defined", nontrst[i].name);
			continue;
		}
		pres[i] = make([][]int, n);
		for ll := 0; ll < n; ll++ {
			pres[i][ll] = curres[ll];
		}
	}
	fatfl = 1;
	if nerrors != 0 {
		summary();
		exit(1);
	}
}

func dumppres() {
	for i := 0; i <= nnonter; i++ {
		print("nonterm %d\n", i);
		curres := pres[i];
		for j := 0; j < len(curres); j++ {
			print("\tproduction %d:", j);
			prd := curres[j];
			for k := 0; k < len(prd); k++ {
				print(" %d", prd[k]);
			}
			print("\n");
		}
	}
}

//
// mark nonterminals which derive the empty string
// also, look for nonterminals which don't derive any token strings
//
func cempty() {
	var i, p, np int;
	var prd []int;

	pempty = make([]int, nnonter+1);

	// first, use the array pempty to detect productions that can never be reduced
	// set pempty to WHONOWS
	aryfil(pempty, nnonter+1, WHOKNOWS);

	// now, look at productions, marking nonterminals which derive something
more:
	for {
		for i = 0; i < nprod; i++ {
			prd = prdptr[i];
			if pempty[prd[0]-NTBASE] != 0 {
				continue;
			}
			np = len(prd)-1;
			for p = 1; p < np; p++ {
				if prd[p] >= NTBASE && pempty[prd[p]-NTBASE] == WHOKNOWS {
					break;
				}
			}
			// production can be derived
			if p == np {
				pempty[prd[0]-NTBASE] = OK;
				continue more;
			}
		}
		break;
	}

	// now, look at the nonterminals, to see if they are all OK
	for i = 0; i <= nnonter; i++ {
		// the added production rises or falls as the start symbol ...
		if i == 0 {
			continue;
		}
		if pempty[i] != OK {
			fatfl = 0;
			error("nonterminal " + nontrst[i].name + " never derives any token string");
		}
	}

	if nerrors != 0 {
		summary();
		exit(1);
	}

	// now, compute the pempty array, to see which nonterminals derive the empty string
	// set pempty to WHOKNOWS
	aryfil(pempty, nnonter+1, WHOKNOWS);

	// loop as long as we keep finding empty nonterminals

again:
	for {
	next:
		for i = 1; i < nprod; i++ {
			// not known to be empty
			prd = prdptr[i];
			if pempty[prd[0]-NTBASE] != WHOKNOWS {
				continue;
			}
			np = len(prd)-1;
			for p = 1; p < np; p++ {
				if prd[p] < NTBASE || pempty[prd[p]-NTBASE] != EMPTY {
					continue next;
				}
			}

			// we have a nontrivially empty nonterminal
			pempty[prd[0]-NTBASE] = EMPTY;

			// got one ... try for another
			continue again;
		}
		return;
	}
}

func dumpempty() {
	for i := 0; i <= nnonter; i++ {
		if pempty[i] == EMPTY {
			print("non-term %d %s matches empty\n", i, symnam(i+NTBASE));
		}
	}
}

//
// compute an array with the first of nonterminals
//
func cpfir() {
	var s, n, p, np, ch, i int;
	var curres [][]int;
	var prd []int;

	wsets = make([]Wset, nnonter+WSETINC);
	pfirst = make([]Lkset, nnonter+1);
	for i = 0; i <= nnonter; i++ {
		wsets[i].ws = mkset();
		pfirst[i] = mkset();
		curres = pres[i];
		n = len(curres);

		// initially fill the sets
		for s = 0; s < n; s++ {
			prd = curres[s];
			np = len(prd)-1;
			for p = 0; p < np; p++ {
				ch = prd[p];
				if ch < NTBASE {
					setbit(pfirst[i], ch);
					break;
				}
				if pempty[ch-NTBASE] == 0 {
					break;
				}
			}
		}
	}

	// now, reflect transitivity
	changes := 1;
	for changes != 0 {
		changes = 0;
		for i = 0; i <= nnonter; i++ {
			curres = pres[i];
			n = len(curres);
			for s = 0; s < n; s++ {
				prd = curres[s];
				np = len(prd)-1;
				for p = 0; p < np; p++ {
					ch = prd[p]-NTBASE;
					if ch < 0 {
						break;
					}
					changes |= setunion(pfirst[i], pfirst[ch]);
					if pempty[ch] == 0 {
						break;
					}
				}
			}
		}
	}

	if indebug == 0 {
		return;
	}
	if foutput != nil {
		for i = 0; i <= nnonter; i++ {
			fmt.Fprintf(foutput, "\n%v: %v %v\n",
				nontrst[i].name, pfirst[i], pempty[i]);
		}
	}
}

//
// generate the states
//
func stagen() {
	// initialize
	nstate = 0;
	tstates = make([]int, ntokens+1);	// states generated by terminal gotos
	ntstates = make([]int, nnonter+1);	// states generated by nonterminal gotos
	amem = make([]int, ACTSIZE);
	memp = 0;

	clset = mkset();
	pstate[0] = 0;
	pstate[1] = 0;
	aryfil(clset, tbitset, 0);
	putitem(Pitem{prdptr[0], 0, 0, 0}, clset);
	tystate[0] = MUSTDO;
	nstate = 1;
	pstate[2] = pstate[1];

	//
	// now, the main state generation loop
	// first pass generates all of the states
	// later passes fix up lookahead
	// could be sped up a lot by remembering
	// results of the first pass rather than recomputing
	//
	first := 1;
	for more := 1; more != 0; first = 0 {
		more = 0;
		for i := 0; i < nstate; i++ {
			if tystate[i] != MUSTDO {
				continue;
			}

			tystate[i] = DONE;
			aryfil(temp1, nnonter+1, 0);

			// take state i, close it, and do gotos
			closure(i);

			// generate goto's
			for p := 0; p < cwp; p++ {
				pi := wsets[p];
				if pi.flag != 0 {
					continue;
				}
				wsets[p].flag = 1;
				c := pi.pitem.first;
				if c <= 1 {
					if pstate[i+1]-pstate[i] <= p {
						tystate[i] = MUSTLOOKAHEAD;
					}
					continue;
				}

				// do a goto on c
				putitem(wsets[p].pitem, wsets[p].ws);
				for q := p+1; q < cwp; q++ {
					// this item contributes to the goto
					if c == wsets[q].pitem.first {
						putitem(wsets[q].pitem, wsets[q].ws);
						wsets[q].flag = 1;
					}
				}

				if c < NTBASE {
					state(c);	// register new state
				} else {
					temp1[c-NTBASE] = state(c);
				}
			}

			if gsdebug != 0 && foutput != nil {
				fmt.Fprintf(foutput, "%v: ", i);
				for j := 0; j <= nnonter; j++ {
					if temp1[j] != 0 {
						fmt.Fprintf(foutput, "%v %v,", nontrst[j].name, temp1[j]);
					}
				}
				fmt.Fprintf(foutput, "\n");
			}

			if first != 0 {
				indgo[i] = apack(temp1[1:len(temp1)], nnonter-1) - 1;
			}

			more++;
		}
	}
}

//
// generate the closure of state i
//
func closure(i int) {
	zzclose++;

	// first, copy kernel of state i to wsets
	cwp = 0;
	q := pstate[i+1];
	for p := pstate[i]; p < q; p++ {
		wsets[cwp].pitem = statemem[p].pitem;
		wsets[cwp].flag = 1;	// this item must get closed
		for ll := 0; ll < len(wsets[cwp].ws); ll++ {
			wsets[cwp].ws[ll] = statemem[p].look[ll];
		}
		cwp++;
	}

	// now, go through the loop, closing each item
	work := 1;
	for work != 0 {
		work = 0;
		for u := 0; u < cwp; u++ {
			if wsets[u].flag == 0 {
				continue;
			}

			// dot is before c
			c := wsets[u].pitem.first;
			if c < NTBASE {
				wsets[u].flag = 0;
				// only interesting case is where . is before nonterminal
				continue;
			}

			// compute the lookahead
			aryfil(clset, tbitset, 0);

			// find items involving c
			for v := u; v < cwp; v++ {
				if wsets[v].flag != 1 || wsets[v].pitem.first != c {
					continue;
				}
				pi := wsets[v].pitem.prod;
				ipi := wsets[v].pitem.off + 1;

				wsets[v].flag = 0;
				if nolook != 0 {
					continue;
				}

				ch := pi[ipi];
				ipi++;
				for ch > 0 {
					// terminal symbol
					if ch < NTBASE {
						setbit(clset, ch);
						break;
					}

					// nonterminal symbol
					setunion(clset, pfirst[ch-NTBASE]);
					if pempty[ch-NTBASE] == 0 {
						break;
					}
					ch = pi[ipi];
					ipi++;
				}
				if ch <= 0 {
					setunion(clset, wsets[v].ws);
				}
			}

			//
			// now loop over productions derived from c
			//
			curres := pres[c-NTBASE];
			n := len(curres);

		nexts:
			// initially fill the sets
			for s := 0; s < n; s++ {
				prd := curres[s];

				//
				// put these items into the closure
				// is the item there
				//
				for v := 0; v < cwp; v++ {
					// yes, it is there
					if wsets[v].pitem.off == 0 &&
						aryeq(wsets[v].pitem.prod, prd) != 0 {
						if nolook == 0 &&
							setunion(wsets[v].ws, clset) != 0 {
							wsets[v].flag = 1;
							work = 1;
						}
						continue nexts;
					}
				}

				//  not there; make a new entry
				if cwp >= len(wsets) {
					awsets := make([]Wset, cwp+WSETINC);
					for ll := 0; ll < len(wsets); ll++ {
						awsets[ll] = wsets[ll];
					}
					wsets = awsets;
				}
				wsets[cwp].pitem = Pitem{prd, 0, prd[0], -prd[len(prd)-1]};
				wsets[cwp].flag = 1;
				wsets[cwp].ws = mkset();
				if nolook == 0 {
					work = 1;
					for ll := 0; ll < len(wsets[cwp].ws); ll++ {
						wsets[cwp].ws[ll] = clset[ll];
					}
				}
				cwp++;
			}
		}
	}

	// have computed closure; flags are reset; return
	if cldebug != 0 && foutput != nil {
		fmt.Fprintf(foutput, "\nState %v, nolook = %v\n", i, nolook);
		for u := 0; u < cwp; u++ {
			if wsets[u].flag != 0 {
				fmt.Fprintf(foutput, "flag set\n");
			}
			wsets[u].flag = 0;
			fmt.Fprintf(foutput, "\t%v", writem(wsets[u].pitem));
			prlook(wsets[u].ws);
			fmt.Fprintf(foutput, "\n");
		}
	}
}

//
// sorts last state,and sees if it equals earlier ones. returns state number
//
func state(c int) int {
	zzstate++;
	p1 := pstate[nstate];
	p2 := pstate[nstate+1];
	if p1 == p2 {
		return 0;	// null state
	}

	// sort the items
	var k, l int;
	for k = p1+1; k < p2; k++ {	// make k the biggest
		for l = k; l > p1; l-- {
			if statemem[l].pitem.prodno < statemem[l-1].pitem.prodno ||
				statemem[l].pitem.prodno == statemem[l-1].pitem.prodno &&
					statemem[l].pitem.off < statemem[l-1].pitem.off {
				s := statemem[l];
				statemem[l] = statemem[l-1];
				statemem[l-1] = s;
			} else {
				break;
			}
		}
	}

	size1 := p2-p1;	// size of state

	var i int;
	if c >= NTBASE {
		i = ntstates[c-NTBASE];
	} else {
		i = tstates[c];
	}

look:
	for ; i != 0; i = mstates[i] {
		// get ith state
		q1 := pstate[i];
		q2 := pstate[i+1];
		size2 := q2-q1;
		if size1 != size2 {
			continue;
		}
		k = p1;
		for l = q1; l < q2; l++ {
			if aryeq(statemem[l].pitem.prod, statemem[k].pitem.prod) == 0 ||
				statemem[l].pitem.off != statemem[k].pitem.off {
				continue look;
			}
			k++;
		}

		// found it
		pstate[nstate+1] = pstate[nstate];	// delete last state

		// fix up lookaheads
		if nolook != 0 {
			return i;
		}
		k = p1;
		for l = q1; l < q2; l++ {
			if setunion(statemem[l].look, statemem[k].look) != 0 {
				tystate[i] = MUSTDO;
			}
			k++;
		}
		return i;
	}

	// state is new
	zznewstate++;
	if nolook != 0 {
		error("yacc state/nolook error");
	}
	pstate[nstate+2] = p2;
	if nstate+1 >= NSTATES {
		error("too many states");
	}
	if c >= NTBASE {
		mstates[nstate] = ntstates[c-NTBASE];
		ntstates[c-NTBASE] = nstate;
	} else {
		mstates[nstate] = tstates[c];
		tstates[c] = nstate;
	}
	tystate[nstate] = MUSTDO;
	nstate++;
	return nstate-1;
}

func putitem(p Pitem, set Lkset) {
	p.off++;
	p.first = p.prod[p.off];

	if pidebug != 0 && foutput != nil {
		fmt.Fprintf(foutput, "putitem(%v), state %v\n", writem(p), nstate);
	}
	j := pstate[nstate+1];
	if j >= len(statemem) {
		asm := make([]Item, j+STATEINC);
		for ll := 0; ll < len(statemem); ll++ {
			asm[ll] = statemem[ll];
		}
		statemem = asm;
	}
	statemem[j].pitem = p;
	if nolook == 0 {
		s := mkset();
		for ll := 0; ll < len(set); ll++ {
			s[ll] = set[ll];
		}
		statemem[j].look = s;
	}
	j++;
	pstate[nstate+1] = j;
}

//
// creates output string for item pointed to by pp
//
func writem(pp Pitem) string {
	var i int;

	p := pp.prod;
	q := chcopy(nontrst[prdptr[pp.prodno][0]-NTBASE].name)+": ";
	npi := pp.off;

	pi := aryeq(p, prdptr[pp.prodno]);

	for {
		c := ' ';
		if pi == npi {
			c = '.';
		}
		q += string(c);

		i = p[pi];
		pi++;
		if i <= 0 {
			break;
		}
		q += chcopy(symnam(i));
	}

	// an item calling for a reduction
	i = p[npi];
	if i < 0 {
		q += fmt.Sprintf("    (%v)", -i);
	}

	return q;
}

//
// pack state i from temp1 into amem
//
func apack(p []int, n int) int {
	//
	// we don't need to worry about checking because
	// we will only look at entries known to be there...
	// eliminate leading and trailing 0's
	//
	off := 0;
	pp := 0;
	for ; pp <= n && p[pp] == 0; pp++ {
		off--;
	}

	// no actions
	if pp > n {
		return 0;
	}
	for ; n > pp && p[n] == 0; n-- {
	}
	p = p[pp : n+1];

	// now, find a place for the elements from p to q, inclusive
	r := len(amem)-len(p);

nextk:
	for rr := 0; rr <= r; rr++ {
		qq := rr;
		for pp = 0; pp < len(p); pp++ {
			if p[pp] != 0 {
				if p[pp] != amem[qq] && amem[qq] != 0 {
					continue nextk;
				}
			}
			qq++;
		}

		// we have found an acceptable k
		if pkdebug != 0 && foutput != nil {
			fmt.Fprintf(foutput, "off = %v, k = %v\n", off+rr, rr);
		}
		qq = rr;
		for pp = 0; pp < len(p); pp++ {
			if p[pp] != 0 {
				if qq > memp {
					memp = qq;
				}
				amem[qq] = p[pp];
			}
			qq++;
		}
		if pkdebug != 0 && foutput != nil {
			for pp = 0; pp <= memp; pp += 10 {
				fmt.Fprintf(foutput, "\n");
				for qq = pp; qq <= pp+9; qq++ {
					fmt.Fprintf(foutput, "%v ", amem[qq]);
				}
				fmt.Fprintf(foutput, "\n");
			}
		}
		return off+rr;
	}
	error("no space in action table");
	return 0;
}

//
// print the output for the states
//
func output() {
	var c, u, v int;

	fmt.Fprintf(ftable, "var\tYYEXCA = []int {\n");

	noset := mkset();

	// output the stuff for state i
	for i := 0; i < nstate; i++ {
		nolook = 0;
		if tystate[i] != MUSTLOOKAHEAD {
			nolook = 1;
		}
		closure(i);

		// output actions
		nolook = 1;
		aryfil(temp1, ntokens+nnonter+1, 0);
		for u = 0; u < cwp; u++ {
			c = wsets[u].pitem.first;
			if c > 1 && c < NTBASE && temp1[c] == 0 {
				for v = u; v < cwp; v++ {
					if c == wsets[v].pitem.first {
						putitem(wsets[v].pitem, noset);
					}
				}
				temp1[c] = state(c);
			} else if c > NTBASE {
				c -= NTBASE;
				if temp1[c+ntokens] == 0 {
					temp1[c+ntokens] = amem[indgo[i]+c];
				}
			}
		}
		if i == 1 {
			temp1[1] = ACCEPTCODE;
		}

		// now, we have the shifts; look at the reductions
		lastred = 0;
		for u = 0; u < cwp; u++ {
			c = wsets[u].pitem.first;

			// reduction
			if c > 0 {
				continue;
			}
			lastred = -c;
			us := wsets[u].ws;
			for k := 0; k <= ntokens; k++ {
				if bitset(us, k) == 0 {
					continue;
				}
				if temp1[k] == 0 {
					temp1[k] = c;
				} else if temp1[k] < 0 {	// reduce/reduce conflict
					if foutput != nil {
						fmt.Fprintf(foutput,
							"\n %v: reduce/reduce conflict  (red'ns "
								"%v and %v) on %v",
							i, -temp1[k], lastred, symnam(k));
					}
					if -temp1[k] > lastred {
						temp1[k] = -lastred;
					}
					zzrrconf++;
				} else {
					// potential shift/reduce conflict
					precftn(lastred, k, i);
				}
			}
		}
		wract(i);
	}

	fmt.Fprintf(ftable, "}\n");
	fmt.Fprintf(ftable, "const\tYYNPROD\t= %v\n", nprod);
	fmt.Fprintf(ftable, "const\tYYPRIVATE\t= %v\n", PRIVATE);
	fmt.Fprintf(ftable, "var\tYYTOKENNAMES []string\n");
	fmt.Fprintf(ftable, "var\tYYSTATES\n[]string\n");
}

//
// decide a shift/reduce conflict by precedence.
// r is a rule number, t a token number
// the conflict is in state s
// temp1[t] is changed to reflect the action
//
func precftn(r, t, s int) {
	var action int;

	lp := levprd[r];
	lt := toklev[t];
	if PLEVEL(lt) == 0 || PLEVEL(lp) == 0 {
		// conflict
		if foutput != nil {
			fmt.Fprintf(foutput,
				"\n%v: shift/reduce conflict (shift %v(%v), red'n %v(%v)) on %v",
				s, temp1[t], PLEVEL(lt), r, PLEVEL(lp), symnam(t));
		}
		zzsrconf++;
		return;
	}
	if PLEVEL(lt) == PLEVEL(lp) {
		action = ASSOC(lt);
	} else if PLEVEL(lt) > PLEVEL(lp) {
		action = RASC;	// shift
	} else {
		action = LASC;
	}	// reduce
	switch action {
	case BASC:	// error action
		temp1[t] = ERRCODE;
	case LASC:	// reduce
		temp1[t] = -r;
	}
}

//
// output state i
// temp1 has the actions, lastred the default
//
func wract(i int) {
	var p, p1 int;

	// find the best choice for lastred
	lastred = 0;
	ntimes := 0;
	for j := 0; j <= ntokens; j++ {
		if temp1[j] >= 0 {
			continue;
		}
		if temp1[j]+lastred == 0 {
			continue;
		}
		// count the number of appearances of temp1[j]
		count := 0;
		tred := -temp1[j];
		levprd[tred] |= REDFLAG;
		for p = 0; p <= ntokens; p++ {
			if temp1[p]+tred == 0 {
				count++;
			}
		}
		if count > ntimes {
			lastred = tred;
			ntimes = count;
		}
	}

	//
	// for error recovery, arrange that, if there is a shift on the
	// error recovery token, `error', that the default be the error action
	//
	if temp1[2] > 0 {
		lastred = 0;
	}

	// clear out entries in temp1 which equal lastred
	// count entries in optst table
	n := 0;
	for p = 0; p <= ntokens; p++ {
		p1 = temp1[p];
		if p1+lastred == 0 {
			temp1[p] = 0;
			p1 = 0;
		}
		if p1 > 0 && p1 != ACCEPTCODE && p1 != ERRCODE {
			n++;
		}
	}

	wrstate(i);
	defact[i] = lastred;
	flag := 0;
	os := make([]int, n*2);
	n = 0;
	for p = 0; p <= ntokens; p++ {
		p1 = temp1[p];
		if p1 != 0 {
			if p1 < 0 {
				p1 = -p1;
			} else if p1 == ACCEPTCODE {
				p1 = -1;
			} else if p1 == ERRCODE {
				p1 = 0;
			} else {
				os[n] = p;
				n++;
				os[n] = p1;
				n++;
				zzacent++;
				continue;
			}
			if flag == 0 {
				fmt.Fprintf(ftable, "-1, %v,\n", i);
			}
			flag++;
			fmt.Fprintf(ftable, "\t%v, %v,\n", p, p1);
			zzexcp++;
		}
	}
	if flag != 0 {
		defact[i] = -2;
		fmt.Fprintf(ftable, "\t-2, %v,\n", lastred);
	}
	optst[i] = os;
}

//
// writes state i
//
func wrstate(i int) {
	var j0, j1, u int;
	var pp, qq int;

	if foutput == nil {
		return;
	}
	fmt.Fprintf(foutput, "\nstate %v\n", i);
	qq = pstate[i+1];
	for pp = pstate[i]; pp < qq; pp++ {
		fmt.Fprintf(foutput, "\t%v\n", writem(statemem[pp].pitem));
	}
	if tystate[i] == MUSTLOOKAHEAD {
		// print out empty productions in closure
		for u = pstate[i+1]-pstate[i]; u < cwp; u++ {
			if wsets[u].pitem.first < 0 {
				fmt.Fprintf(foutput, "\t%v\n", writem(wsets[u].pitem));
			}
		}
	}

	// check for state equal to another
	for j0 = 0; j0 <= ntokens; j0++ {
		j1 = temp1[j0];
		if j1 != 0 {
			fmt.Fprintf(foutput, "\n\t%v  ", symnam(j0));

			// shift, error, or accept
			if j1 > 0 {
				if j1 == ACCEPTCODE {
					fmt.Fprintf(foutput, "accept");
				} else if j1 == ERRCODE {
					fmt.Fprintf(foutput, "error");
				} else {
					fmt.Fprintf(foutput, "shift %v", j1);
				}
			} else {
				fmt.Fprintf(foutput, "reduce %v (src line %v)", -j1, rlines[-j1]);
			}
		}
	}

	// output the final production
	if lastred != 0 {
		fmt.Fprintf(foutput, "\n\t.  reduce %v (src line %v)\n\n",
			lastred, rlines[lastred]);
	} else {
		fmt.Fprintf(foutput, "\n\t.  error\n\n");
	}

	// now, output nonterminal actions
	j1 = ntokens;
	for j0 = 1; j0 <= nnonter; j0++ {
		j1++;
		if temp1[j1] != 0 {
			fmt.Fprintf(foutput, "\t%v  goto %v\n", symnam(j0+NTBASE), temp1[j1]);
		}
	}
}

//
// output the gotos for the nontermninals
//
func go2out() {
	for i := 1; i <= nnonter; i++ {
		go2gen(i);

		// find the best one to make default
		best := -1;
		times := 0;

		// is j the most frequent
		for j := 0; j < nstate; j++ {
			if tystate[j] == 0 {
				continue;
			}
			if tystate[j] == best {
				continue;
			}

			// is tystate[j] the most frequent
			count := 0;
			cbest := tystate[j];
			for k := j; k < nstate; k++ {
				if tystate[k] == cbest {
					count++;
				}
			}
			if count > times {
				best = cbest;
				times = count;
			}
		}

		// best is now the default entry
		zzgobest += times-1;
		n := 0;
		for j := 0; j < nstate; j++ {
			if tystate[j] != 0 && tystate[j] != best {
				n++;
			}
		}
		goent := make([]int, 2*n + 1);
		n = 0;
		for j := 0; j < nstate; j++ {
			if tystate[j] != 0 && tystate[j] != best {
				goent[n] = j;
				n++;
				goent[n] = tystate[j];
				n++;
				zzgoent++;
			}
		}

		// now, the default
		if best == -1 {
			best = 0;
		}

		zzgoent++;
		goent[n] = best;
		yypgo[i] = goent;
	}
}

//
// output the gotos for nonterminal c
//
func go2gen(c int) {
	var i, cc, p, q int;

	// first, find nonterminals with gotos on c
	aryfil(temp1, nnonter+1, 0);
	temp1[c] = 1;
	work := 1;
	for work != 0 {
		work = 0;
		for i = 0; i < nprod; i++ {
			// cc is a nonterminal with a goto on c
			cc = prdptr[i][1]-NTBASE;
			if cc >= 0 && temp1[cc] != 0 {
				// thus, the left side of production i does too
				cc = prdptr[i][0]-NTBASE;
				if temp1[cc] == 0 {
					work = 1;
					temp1[cc] = 1;
				}
			}
		}
	}

	// now, we have temp1[c] = 1 if a goto on c in closure of cc
	if g2debug != 0 && foutput != nil {
		fmt.Fprintf(foutput, "%v: gotos on ", nontrst[c].name);
		for i = 0; i <= nnonter; i++ {
			if temp1[i] != 0 {
				fmt.Fprintf(foutput, "%v ", nontrst[i].name);
			}
		}
		fmt.Fprintf(foutput, "\n");
	}

	// now, go through and put gotos into tystate
	aryfil(tystate, nstate, 0);
	for i = 0; i < nstate; i++ {
		q = pstate[i+1];
		for p = pstate[i]; p < q; p++ {
			cc = statemem[p].pitem.first;
			if cc >= NTBASE {
				// goto on c is possible
				if temp1[cc-NTBASE] != 0 {
					tystate[i] = amem[indgo[i]+c];
					break;
				}
			}
		}
	}
}

//
// in order to free up the mem and amem arrays for the optimizer,
// and still be able to output yyr1, etc., after the sizes of
// the action array is known, we hide the nonterminals
// derived by productions in levprd.
//
func hideprod() {
	nred := 0;
	levprd[0] = 0;
	for i := 1; i < nprod; i++ {
		if (levprd[i]&REDFLAG) == 0 {
			if foutput != nil {
				fmt.Fprintf(foutput, "Rule not reduced: %v\n",
					writem(Pitem{prdptr[i], 0, 0, i}));
			}
			fmt.Printf("rule %v never reduced\n", writem(Pitem{prdptr[i], 0, 0, i}));
			nred++;
		}
		levprd[i] = prdptr[i][0]-NTBASE;
	}
	if nred != 0 {
		fmt.Printf("%v rules never reduced\n", nred);
	}
}

func callopt() {
	var j, k, p, q, i int;
	var v []int;

	pgo = make([]int, nnonter+1);
	pgo[0] = 0;
	maxoff = 0;
	maxspr = 0;
	for i = 0; i < nstate; i++ {
		k = 32000;
		j = 0;
		v = optst[i];
		q = len(v);
		for p = 0; p < q; p += 2 {
			if v[p] > j {
				j = v[p];
			}
			if v[p] < k {
				k = v[p];
			}
		}

		// nontrivial situation
		if k <= j {
			// j is now the range
			//			j -= k;			// call scj
			if k > maxoff {
				maxoff = k;
			}
		}
		tystate[i] = q + 2*j;
		if j > maxspr {
			maxspr = j;
		}
	}

	// initialize ggreed table
	ggreed = make([]int, nnonter+1);
	for i = 1; i <= nnonter; i++ {
		ggreed[i] = 1;
		j = 0;

		// minimum entry index is always 0
		v = yypgo[i];
		q = len(v)-1;
		for p = 0; p < q; p += 2 {
			ggreed[i] += 2;
			if v[p] > j {
				j = v[p];
			}
		}
		ggreed[i] = ggreed[i] + 2*j;
		if j > maxoff {
			maxoff = j;
		}
	}

	// now, prepare to put the shift actions into the amem array
	for i = 0; i < ACTSIZE; i++ {
		amem[i] = 0;
	}
	maxa = 0;
	for i = 0; i < nstate; i++ {
		if tystate[i] == 0 && adb > 1 {
			fmt.Fprintf(ftable, "State %v: null\n", i);
		}
		indgo[i] = YYFLAG;
	}

	i = nxti();
	for i != NOMORE {
		if i >= 0 {
			stin(i);
		} else {
			gin(-i);
		}
		i = nxti();
	}

	// print amem array
	if adb > 2 {
		for p = 0; p <= maxa; p += 10 {
			fmt.Fprintf(ftable, "%v  ", p);
			for i = 0; i < 10; i++ {
				fmt.Fprintf(ftable, "%v  ", amem[p+i]);
			}
			putrune(ftable, '\n');
		}
	}

	aoutput();
	osummary();
}

//
// finds the next i
//
func nxti() int {
	max := 0;
	maxi := 0;
	for i := 1; i <= nnonter; i++ {
		if ggreed[i] >= max {
			max = ggreed[i];
			maxi = -i;
		}
	}
	for i := 0; i < nstate; i++ {
		if tystate[i] >= max {
			max = tystate[i];
			maxi = i;
		}
	}
	if max == 0 {
		return NOMORE;
	}
	return maxi;
}

func gin(i int) {
	var s int;

	// enter gotos on nonterminal i into array amem
	ggreed[i] = 0;

	q := yypgo[i];
	nq := len(q)-1;

	// now, find amem place for it
nextgp:
	for p := 0; p < ACTSIZE; p++ {
		if amem[p] != 0 {
			continue;
		}
		for r := 0; r < nq; r += 2 {
			s = p+q[r]+1;
			if s > maxa {
				maxa = s;
				if maxa >= ACTSIZE {
					error("a array overflow");
				}
			}
			if amem[s] != 0 {
				continue nextgp;
			}
		}

		// we have found amem spot
		amem[p] = q[nq];
		if p > maxa {
			maxa = p;
		}
		for r := 0; r < nq; r += 2 {
			s = p+q[r]+1;
			amem[s] = q[r+1];
		}
		pgo[i] = p;
		if adb > 1 {
			fmt.Fprintf(ftable, "Nonterminal %v, entry at %v\n", i, pgo[i]);
		}
		return;
	}
	error("cannot place goto %v\n", i);
}

func stin(i int) {
	var s int;

	tystate[i] = 0;

	// enter state i into the amem array
	q := optst[i];
	nq := len(q);

nextn:
	// find an acceptable place
	for n := -maxoff; n < ACTSIZE; n++ {
		flag := 0;
		for r := 0; r < nq; r += 2 {
			s = q[r]+n;
			if s < 0 || s > ACTSIZE {
				continue nextn;
			}
			if amem[s] == 0 {
				flag++;
			} else if amem[s] != q[r+1] {
				continue nextn;
			}
		}

		// check the position equals another only if the states are identical
		for j := 0; j < nstate; j++ {
			if indgo[j] == n {

				// we have some disagreement
				if flag != 0 {
					continue nextn;
				}
				if nq == len(optst[j]) {

					// states are equal
					indgo[i] = n;
					if adb > 1 {
						fmt.Fprintf(ftable, "State %v: entry at"
							"%v equals state %v\n",
							i, n, j);
					}
					return;
				}

				// we have some disagreement
				continue nextn;
			}
		}

		for r := 0; r < nq; r += 2 {
			s = q[r]+n;
			if s > maxa {
				maxa = s;
			}
			if amem[s] != 0 && amem[s] != q[r+1] {
				error("clobber of a array, pos'n %v, by %v", s, q[r+1]);
			}
			amem[s] = q[r+1];
		}
		indgo[i] = n;
		if adb > 1 {
			fmt.Fprintf(ftable, "State %v: entry at %v\n", i, indgo[i]);
		}
		return;
	}
	error("Error; failure to place state %v", i);
}

//
// this version is for limbo
// write out the optimized parser
//
func aoutput() {
	fmt.Fprintf(ftable, "const\tYYLAST\t= %v\n", maxa+1);
	arout("YYACT", amem, maxa+1);
	arout("YYPACT", indgo, nstate);
	arout("YYPGO", pgo, nnonter+1);
}

//
// put out other arrays, copy the parsers
//
func others() {
	var i, j int;

	arout("YYR1", levprd, nprod);
	aryfil(temp1, nprod, 0);

	//
	//yyr2 is the number of rules for each production
	//
	for i = 1; i < nprod; i++ {
		temp1[i] = len(prdptr[i])-2;
	}
	arout("YYR2", temp1, nprod);

	aryfil(temp1, nstate, -1000);
	for i = 0; i <= ntokens; i++ {
		for j := tstates[i]; j != 0; j = mstates[j] {
			temp1[j] = i;
		}
	}
	for i = 0; i <= nnonter; i++ {
		for j = ntstates[i]; j != 0; j = mstates[j] {
			temp1[j] = -i;
		}
	}
	arout("YYCHK", temp1, nstate);
	arout("YYDEF", defact, nstate);

	// put out token translation tables
	// table 1 has 0-256
	aryfil(temp1, 256, 0);
	c := 0;
	for i = 1; i <= ntokens; i++ {
		j = tokset[i].value;
		if j >= 0 && j < 256 {
			if temp1[j] != 0 {
				print("yacc bug -- cant have 2 different Ts with same value\n");
				print("	%s and %s\n", tokset[i].name, tokset[temp1[j]].name);
				nerrors++;
			}
			temp1[j] = i;
			if j > c {
				c = j;
			}
		}
	}
	for i = 0; i <= c; i++ {
		if temp1[i] == 0 {
			temp1[i] = YYLEXUNK;
		}
	}
	arout("YYTOK1", temp1, c+1);

	// table 2 has PRIVATE-PRIVATE+256
	aryfil(temp1, 256, 0);
	c = 0;
	for i = 1; i <= ntokens; i++ {
		j = tokset[i].value - PRIVATE;
		if j >= 0 && j < 256 {
			if temp1[j] != 0 {
				print("yacc bug -- cant have 2 different Ts with same value\n");
				print("	%s and %s\n", tokset[i].name, tokset[temp1[j]].name);
				nerrors++;
			}
			temp1[j] = i;
			if j > c {
				c = j;
			}
		}
	}
	arout("YYTOK2", temp1, c+1);

	// table 3 has everything else
	fmt.Fprintf(ftable, "var\tYYTOK3\t= []int {\n");
	c = 0;
	for i = 1; i <= ntokens; i++ {
		j = tokset[i].value;
		if j >= 0 && j < 256 {
			continue;
		}
		if j >= PRIVATE && j < 256+PRIVATE {
			continue;
		}

		fmt.Fprintf(ftable, "%4d,%4d,", j, i);
		c++;
		if c%5 == 0 {
			putrune(ftable, '\n');
		}
	}
	fmt.Fprintf(ftable, "%4d\n };\n", 0);

	// copy parser text
	c = getrune(finput);
	for c != EOF {
		putrune(ftable, c);
		c = getrune(finput);
	}

	// copy yaccpar
	fmt.Fprintf(ftable, "%v", yaccpar);
}

func arout(s string, v []int, n int) {
	fmt.Fprintf(ftable, "var\t%v\t= []int {\n", s);
	for i := 0; i < n; i++ {
		if i%10 == 0 {
			putrune(ftable, '\n');
		}
		fmt.Fprintf(ftable, "%4d", v[i]);
		putrune(ftable, ',');
	}
	fmt.Fprintf(ftable, "\n};\n");
}

//
// output the summary on y.output
//
func summary() {
	if foutput != nil {
		fmt.Fprintf(foutput, "\n%v terminals, %v nonterminals\n", ntokens, nnonter+1);
		fmt.Fprintf(foutput, "%v grammar rules, %v/%v states\n", nprod, nstate, NSTATES);
		fmt.Fprintf(foutput, "%v shift/reduce, %v reduce/reduce conflicts reported\n", zzsrconf, zzrrconf);
		fmt.Fprintf(foutput, "%v working sets used\n", len(wsets));
		fmt.Fprintf(foutput, "memory: parser %v/%v\n", memp, ACTSIZE);
		fmt.Fprintf(foutput, "%v extra closures\n", zzclose - 2*nstate);
		fmt.Fprintf(foutput, "%v shift entries, %v exceptions\n", zzacent, zzexcp);
		fmt.Fprintf(foutput, "%v goto entries\n", zzgoent);
		fmt.Fprintf(foutput, "%v entries saved by goto default\n", zzgobest);
	}
	if zzsrconf != 0 || zzrrconf != 0 {
		fmt.Printf("\nconflicts: ");
		if zzsrconf != 0 {
			fmt.Printf("%v shift/reduce", zzsrconf);
		}
		if zzsrconf != 0 && zzrrconf != 0 {
			fmt.Printf(", ");
		}
		if zzrrconf != 0 {
			fmt.Printf("%v reduce/reduce", zzrrconf);
		}
		fmt.Printf("\n");
	}
}

//
// write optimizer summary
//
func osummary() {
	if foutput == nil {
		return;
	}
	i := 0;
	for p := maxa; p >= 0; p-- {
		if amem[p] == 0 {
			i++;
		}
	}

	fmt.Fprintf(foutput, "Optimizer space used: output %v/%v\n", maxa+1, ACTSIZE);
	fmt.Fprintf(foutput, "%v table entries, %v zero\n", maxa+1, i);
	fmt.Fprintf(foutput, "maximum spread: %v, maximum offset: %v\n", maxspr, maxoff);
}

//
// copies and protects "'s in q
//
func chcopy(q string) string {
	s := "";
	i := 0;
	j := 0;
	for i = 0; i < len(q); i++ {
		if q[i] == '"' {
			s += q[j:i]+"\\";
			j = i;
		}
	}
	return s+q[j:i];
}

func usage() {
	fmt.Fprintf(stderr, "usage: gacc [-o output] [-v parsetable] input\n");
	exit(1);
}

func bitset(set Lkset, bit int) int {
	return set[bit>>5]&(1<<uint(bit&31));
}

func setbit(set Lkset, bit int) {
	set[bit>>5] |= (1<<uint(bit&31));
}

func mkset() Lkset {
	return make([]int, tbitset);
}

//
// set a to the union of a and b
// return 1 if b is not a subset of a, 0 otherwise
//
func setunion(a, b []int) int {
	sub := 0;
	for i := 0; i < tbitset; i++ {
		x := a[i];
		y := x|b[i];
		a[i] = y;
		if y != x {
			sub = 1;
		}
	}
	return sub;
}

func prlook(p Lkset) {
	if p == nil {
		fmt.Fprintf(foutput, "\tNULL");
		return;
	}
	fmt.Fprintf(foutput, " { ");
	for j := 0; j <= ntokens; j++ {
		if bitset(p, j) != 0 {
			fmt.Fprintf(foutput, "%v ", symnam(j));
		}
	}
	fmt.Fprintf(foutput, "}");
}

//
// utility routines
//
var peekrune int

func isdigit(c int) bool {
	return c >= '0' && c <= '9';
}

func isword(c int) bool {
	return c >= 0xa0 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}

func mktemp(t string) string {
	return t;
}

//
// return 1 if 2 arrays are equal
// return 0 if not equal
//
func aryeq(a []int, b []int) int {
	n := len(a);
	if len(b) != n {
		return 0;
	}
	for ll := 0; ll < n; ll++ {
		if a[ll] != b[ll] {
			return 0;
		}
	}
	return 1;
}

func putrune(f *bufio.Writer, c int) {
	s := string(c);
	for i := 0; i < len(s); i++ {
		f.WriteByte(s[i]);
	}
}

func getrune(f *bufio.Reader) int {
	var r int;

	if peekrune != 0 {
		if peekrune == EOF {
			return EOF;
		}
		r = peekrune;
		peekrune = 0;
		return r;
	}

	c, n, err := f.ReadRune();
	if n == 0 {
		return EOF;
	}
	if err != nil {
		error("read error: %v", err);
	}
	//fmt.Printf("rune = %v n=%v\n", string(c), n);
	return c;
}

func ungetrune(f *bufio.Reader, c int) {
	if f != finput {
		panic("ungetc - not finput");
	}
	if peekrune != 0 {
		panic("ungetc - 2nd unget");
	}
	peekrune = c;
}

func write(f *bufio.Writer, b []byte, n int) int {
	println("write");
	return 0;
}

func open(s string) *bufio.Reader {
	fi, err := os.Open(s, os.O_RDONLY, 0);
	if err != nil {
		error("error opening %v: %v", s, err);
	}
	//fmt.Printf("open %v\n", s);
	return bufio.NewReader(fi);
}

func create(s string, m int) *bufio.Writer {
	fo, err := os.Open(s, os.O_WRONLY | os.O_CREAT | os.O_TRUNC, m);
	if err != nil {
		error("error opening %v: %v", s, err);
	}
	//fmt.Printf("create %v mode %v\n", s, m);
	return bufio.NewWriter(fo);
}

//
// write out error comment
//
func error(s string, v ...) {
	nerrors++;
	fmt.Fprintf(stderr, s, v);
	fmt.Fprintf(stderr, ": %v:%v\n", infile, lineno);
	if fatfl != 0 {
		summary();
		exit(1);
	}
}

func exit(status int) {
	if ftable != nil {
		ftable.Flush();
		ftable = nil;
	}
	if foutput != nil {
		foutput.Flush();
		foutput = nil;
	}
	if stderr != nil {
		stderr.Flush();
		stderr = nil;
	}
	os.Exit(status);
}

var yaccpar =
// from here to the end of the file is
// a single string containing the old yaccpar file
`
/*	parser for yacc output	*/

var	Nerrs		= 0		/* number of errors */
var	Errflag		= 0		/* error recovery flag */
var	Debug		= 0
const	YYFLAG		= -1000

func
Tokname(yyc int) string
{
	if yyc > 0 && yyc <= len(Toknames) {
		if Toknames[yyc-1] != "" {
			return Toknames[yyc-1];
		}
	}
	return fmt.Sprintf("tok-%v", yyc);
}

func
Statname(yys int) string
{
	if yys >= 0 && yys < len(Statenames) {
		if Statenames[yys] != "" {
			return Statenames[yys];
		}
	}
	return fmt.Sprintf("state-%v", yys);
}

func
lex1() int
{
	var yychar int;
	var c int;

	yychar = Lex();
	if yychar <= 0 {
		c = YYTOK1[0];
		goto out;
	}
	if yychar < len(YYTOK1) {
		c = YYTOK1[yychar];
		goto out;
	}
	if yychar >= YYPRIVATE {
		if yychar < YYPRIVATE+len(YYTOK2) {
			c = YYTOK2[yychar-YYPRIVATE];
			goto out;
		}
	}
	for i:=0; i<len(YYTOK3); i+=2 {
		c = YYTOK3[i+0];
		if c == yychar {
			c = YYTOK3[i+1];
			goto out;
		}
	}
	c = 0;

out:
	if c == 0 {
		c = YYTOK2[1];	/* unknown char */
	}
	if Debug >= 3 {
		fmt.Printf("lex %.4lux %s\n", yychar, Tokname(c));
	}
	return c;
}

func
Parse() int
{
	var yyj, yystate, yyn, yyg, yyxi, yyp int;
	var yychar int;
	var yypt, yynt int;

	yystate = 0;
	yychar = -1;
	Nerrs = 0;
	Errflag = 0;
	yyp = -1;
	goto yystack;

ret0:
	return 0;

ret1:
	return 1;

yystack:
	/* put a state and value onto the stack */
	if Debug >= 4 {
		fmt.Printf("char %v in %v", Tokname(yychar), Statname(yystate));
	}

	yyp++;
	if yyp >= len(YYS) {
		Error("yacc stack overflow");
		goto ret1;
	}
	YYS[yyp] = YYVAL;
	YYS[yyp].yys = yystate;

yynewstate:
	yyn = YYPACT[yystate];
	if yyn <= YYFLAG {
		goto yydefault; /* simple state */
	}
	if yychar < 0 {
		yychar = lex1();
	}
	yyn += yychar;
	if yyn < 0 || yyn >= YYLAST {
		goto yydefault;
	}
	yyn = YYACT[yyn];
	if YYCHK[yyn] == yychar { /* valid shift */
		yychar = -1;
		YYVAL = yylval;
		yystate = yyn;
		if Errflag > 0 {
			Errflag--;
		}
		goto yystack;
	}

yydefault:
	/* default state action */
	yyn = YYDEF[yystate];
	if yyn == -2 {
		if yychar < 0 {
			yychar = lex1();
		}

		/* look through exception table */
		for yyxi=0;; yyxi+=2 {
			if YYEXCA[yyxi+0] == -1 && YYEXCA[yyxi+1] == yystate {
				break;
			}
		}
		for yyxi += 2;; yyxi += 2 {
			yyn = YYEXCA[yyxi+0];
			if yyn < 0 || yyn == yychar {
				break;
			}
		}
		yyn = YYEXCA[yyxi+1];
		if yyn < 0 {
			goto ret0;
		}
	}
	if yyn == 0 {
		/* error ... attempt to resume parsing */
		switch Errflag {
		case 0:   /* brand new error */
			Error("syntax error");
			Nerrs++;
			if Debug >= 1 {
				fmt.Printf("%s", Statname(yystate));
				fmt.Printf("saw %s\n", Tokname(yychar));
			}
			fallthrough;

		case 1,2: /* incompletely recovered error ... try again */
			Errflag = 3;

			/* find a state where "error" is a legal shift action */
			for yyp >= len(YYS) {
				yyn = YYPACT[YYS[yyp].yys] + YYERRCODE;
				if yyn >= 0 && yyn < YYLAST {
					yystate = YYACT[yyn];  /* simulate a shift of "error" */
					if YYCHK[yystate] == YYERRCODE {
						goto yystack;
					}
				}

				/* the current yyp has no shift onn "error", pop stack */
				if Debug >= 2 {
					fmt.Printf("error recovery pops state %d, uncovers %d\n",
						YYS[yyp].yys, YYS[yyp-1].yys );
				}
				yyp--;
			}
			/* there is no state on the stack with an error shift ... abort */
			goto ret1;

		case 3:  /* no shift yet; clobber input char */
			if Debug >= 2 {
				fmt.Printf("error recovery discards %s\n", Tokname(yychar));
			}
			if yychar == YYEOFCODE {
				goto ret1;
			}
			yychar = -1;
			goto yynewstate;   /* try again in the same state */
		}
	}

	/* reduction by production yyn */
	if Debug >= 2 {
		fmt.Printf("reduce %v in:\n\t%v", yyn, Statname(yystate));
	}

	yynt = yyn;
	yypt = yyp;

	yyp -= YYR2[yyn];
	YYVAL = YYS[yyp+1];

	/* consult goto table to find next state */
	yyn = YYR1[yyn];
	yyg = YYPGO[yyn];
	yyj = yyg + YYS[yyp].yys + 1;

	if yyj >= YYLAST {
		yystate = YYACT[yyg];
	} else {
		yystate = YYACT[yyj];
		if YYCHK[yystate] != -yyn {
			yystate = YYACT[yyg];
		}
	}

	yyrun(yynt, yypt);
	goto yystack;  /* stack new state and value */
}
`
