aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2009-11-05 22:29:29 -0800
committerRobert Griesemer <gri@golang.org>2009-11-05 22:29:29 -0800
commit054354ebd410d14c023cc21d011d1bd6632f91f3 (patch)
treedfac3a36adc215a4f662f7cd1fe0be39a26ee267
parent79284cae32ae358684182efad32f301bfbf68729 (diff)
downloadgo-054354ebd410d14c023cc21d011d1bd6632f91f3.tar.gz
go-054354ebd410d14c023cc21d011d1bd6632f91f3.zip
gofmt src/cmd/goyacc
(with this change: gofmt -l src/cmd/ | wc is 0 0 0) R=ken, rsc http://go/go-review/1024005
-rw-r--r--src/cmd/goyacc/goyacc.go1028
1 files changed, 445 insertions, 583 deletions
diff --git a/src/cmd/goyacc/goyacc.go b/src/cmd/goyacc/goyacc.go
index 763e61cb03..7717cc8395 100644
--- a/src/cmd/goyacc/goyacc.go
+++ b/src/cmd/goyacc/goyacc.go
@@ -44,8 +44,7 @@ package main
// major difference is lack of stem ("y" variable)
//
-import
-(
+import (
"flag";
"fmt";
"bufio";
@@ -54,66 +53,61 @@ import
// the following are adjustable
// according to memory size
-const
-(
+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
+ 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
+ PRIVATE = 0xE000; // unicode private use
-// relationships which must hold:
-// TEMPSIZE >= NTERMS + NNONTERM + 1;
-// TEMPSIZE >= NSTATES;
-//
+ // 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
+ TOKSTART = 4; //index of first defined token
)
// no, left, right, binary assoc.
-const
-(
- NOASC = iota;
+const (
+ NOASC = iota;
LASC;
RASC;
BASC;
)
// flags for state generation
-const
-(
- DONE = iota;
+const (
+ DONE = iota;
MUSTDO;
MUSTLOOKAHEAD;
)
// flags for a rule having an action, and being reduced
-const
-(
- ACTFLAG = 1<<(iota+2);
+const (
+ ACTFLAG = 1<<(iota+2);
REDFLAG;
)
// output parser flags
-const YYFLAG = -1000
+const YYFLAG = -1000
// parse tokens
-const
-(
+const (
IDENTIFIER = PRIVATE+iota;
MARK;
TERM;
@@ -130,246 +124,222 @@ const
UNION;
)
-const ENDFILE = 0
-const EMPTY = 1
-const WHOKNOWS = 0
-const OK = 1
-const NOMORE = -1000
+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 ASSOC(i int) int {
+ return i&3;
}
-func
-PLEVEL(i int) int
-{
- return (i >> 4) & 077;
+func PLEVEL(i int) int {
+ return (i>>4)&077;
}
-func
-TYPE(i int) int
-{
- return (i >> 10) & 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 SETASC(i, j int) int {
+ return i|j;
}
-func
-SETPLEV(i, j int) int
-{
- return i | (j << 4);
+func SETPLEV(i, j int) int {
+ return i|(j<<4);
}
-func
-SETTYPE(i, j int) int
-{
- return i | (j << 10);
+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 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 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
+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;
+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 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 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 Item struct {
+ pitem Pitem;
+ look Lkset;
}
-type Symb
-struct
-{
- name string;
- value int;
+type Symb struct {
+ name string;
+ value int;
}
-type Wset
-struct
-{
- pitem Pitem;
- flag int;
- ws Lkset;
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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 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
+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
+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
+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
-{
+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 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
+var zznewstate = 0
-func
-main()
-{
+const EOF = -1
+const UTFmax = 0x3f
- setup(); // initialize and read productions
+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
+ 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
+ stagen(); // generate the states
yypgo = make([][]int, nnonter+1);
optst = make([][]int, nstate);
- output(); // write the states and the tables
+ output(); // write the states and the tables
go2out();
hideprod();
@@ -382,9 +352,7 @@ main()
exit(0);
}
-func
-setup()
-{
+func setup() {
var j, ty int;
stderr = bufio.NewWriter(os.NewFile(2, "stderr"));
@@ -414,13 +382,13 @@ setup()
t := gettok();
- outer:
+outer:
for {
switch t {
default:
error("syntax error tok=%v", t-PRIVATE);
- case MARK,ENDFILE:
+ case MARK, ENDFILE:
break outer;
case ';':
@@ -445,18 +413,20 @@ setup()
t = chfind(1, tokname);
if t < NTBASE {
j = TYPE(toklev[t]);
- if(j != 0 && j != ty) {
+ if j != 0 && j != ty {
error("type redeclaration of token ",
tokset[t].name);
- } else
+ } else {
toklev[t] = SETTYPE(toklev[t], ty);
+ }
} else {
j = nontrst[t-NTBASE].value;
- if(j != 0 && j != ty) {
+ if j != 0 && j != ty {
error("type redeclaration of nonterminal %v",
nontrst[t-NTBASE].name);
- } else
+ } else {
nontrst[t-NTBASE].value = ty;
+ }
}
continue;
@@ -470,7 +440,7 @@ setup()
case UNION:
cpyunion();
- case LEFT,BINARY,RIGHT,TERM:
+ case LEFT, BINARY, RIGHT, TERM:
// nonzero means new prec. and assoc.
lev := t-TERM;
if lev != 0 {
@@ -492,7 +462,7 @@ setup()
t = gettok();
continue;
- case';':
+ case ';':
break;
case IDENTIFIER:
@@ -536,7 +506,7 @@ setup()
}
// put out non-literal terminals
- for i:=TOKSTART; i<=ntokens; i++ {
+ for i := TOKSTART; i <= ntokens; i++ {
// non-literals
c := tokset[i].name[0];
if c != ' ' && c != '$' {
@@ -546,16 +516,16 @@ setup()
// put out names of token names
fmt.Fprintf(ftable, "var\tToknames\t =[]string {\n");
- for i:=TOKSTART; i<=ntokens; i++ {
+ 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);
-// }
+ // for i:=TOKSTART; i<=ntokens; i++ {
+ // fmt.Fprintf(ftable, "\t\"%v\",\n", tokset[i].name);
+ // }
fmt.Fprintf(ftable, "}\n");
fmt.Fprintf(ftable, "\nfunc\n");
@@ -563,7 +533,7 @@ setup()
fmt.Fprintf(ftable, "switch p {\n");
moreprod();
- prdptr[0] = []int{NTBASE,start,1,0};
+ prdptr[0] = []int{NTBASE, start, 1, 0};
nprod = 1;
curprod := make([]int, RULEINC);
@@ -590,15 +560,15 @@ setup()
if t == '|' {
curprod[mem] = prdptr[nprod-1][0];
mem++;
- } else
- if t == IDENTCOLON {
+ } else if t == IDENTCOLON {
curprod[mem] = chfind(1, tokname);
if curprod[mem] < NTBASE {
error("token illegal on LHS of grammar rule");
}
mem++;
- } else
+ } else {
error("illegal rule: missing semicolon or | ?");
+ }
// read rule body
t = gettok();
@@ -611,7 +581,7 @@ setup()
mem++;
if mem >= len(curprod) {
ncurprod := make([]int, mem+RULEINC);
- for ll:=0; ll<mem; ll++ {
+ for ll := 0; ll < mem; ll++ {
ncurprod[ll] = curprod[ll];
}
curprod = ncurprod;
@@ -624,7 +594,7 @@ setup()
}
j = chfind(2, tokname);
if j >= NTBASE {
- error("nonterminal "+nontrst[j-NTBASE].name+" illegal after %%prec");
+ error("nonterminal " + nontrst[j-NTBASE].name + " illegal after %%prec");
}
levprd[nprod] = toklev[j];
t = gettok();
@@ -640,7 +610,7 @@ setup()
t = gettok();
if t == IDENTIFIER {
// make it a nonterminal
- j = chfind(1, fmt.Sprintf("$$%v",nprod));
+ j = chfind(1, fmt.Sprintf("$$%v", nprod));
//
// the current rule will become rule number nprod+1
@@ -662,7 +632,7 @@ setup()
mem++;
if mem >= len(curprod) {
ncurprod := make([]int, mem+RULEINC);
- for ll:=0; ll<mem; ll++ {
+ for ll := 0; ll < mem; ll++ {
ncurprod[ll] = curprod[ll];
}
curprod = ncurprod;
@@ -678,7 +648,7 @@ setup()
// check that default action is reasonable
if ntypes != 0 && (levprd[nprod]&ACTFLAG) == 0 &&
- nontrst[curprod[0]-NTBASE].value != 0 {
+ nontrst[curprod[0]-NTBASE].value != 0 {
// no explicit action, LHS has value
tempty := curprod[1];
if tempty < 0 {
@@ -686,8 +656,9 @@ setup()
}
if tempty >= NTBASE {
tempty = nontrst[tempty-NTBASE].value;
- } else
+ } else {
tempty = TYPE(toklev[tempty]);
+ }
if tempty != nontrst[curprod[0]-NTBASE].value {
error("default action causes potential type clash");
}
@@ -697,7 +668,7 @@ setup()
}
moreprod();
prdptr[nprod] = make([]int, mem);
- for ll:=0; ll<mem; ll++ {
+ for ll := 0; ll < mem; ll++ {
prdptr[nprod][ll] = curprod[ll];
}
nprod++;
@@ -737,9 +708,7 @@ setup()
//
// allocate enough room to hold another production
//
-func
-moreprod()
-{
+func moreprod() {
n := len(prdptr);
if nprod >= n {
nn := n+PRODINC;
@@ -747,7 +716,7 @@ moreprod()
alevprd := make([]int, nn);
arlines := make([]int, nn);
- for ll:=0; ll<n; ll++ {
+ for ll := 0; ll < n; ll++ {
aprod[ll] = prdptr[ll];
alevprd[ll] = levprd[ll];
arlines[ll] = rlines[ll];
@@ -763,21 +732,19 @@ moreprod()
// define s to be a terminal if t=0
// or a nonterminal if t=1
//
-func
-defin(nt int, s string) int
-{
+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++ {
+ for ll := 0; ll < len(nontrst); ll++ {
anontrst[ll] = nontrst[ll];
}
nontrst = anontrst;
}
nontrst[nnonter] = Symb{s, 0};
- return NTBASE + nnonter;
+ return NTBASE+nnonter;
}
// must be a token
@@ -787,7 +754,7 @@ defin(nt int, s string) int
atokset := make([]Symb, nn);
atoklev := make([]int, nn);
- for ll:=0; ll<len(tokset); ll++ {
+ for ll := 0; ll < len(tokset); ll++ {
atoklev[ll] = toklev[ll];
atokset[ll] = tokset[ll];
}
@@ -802,25 +769,32 @@ defin(nt int, s string) int
// 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) {
+ } 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';
+ 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
+ } else if s[2] == 'u' && len(s) == 2+1+4 { // \unnnn sequence
val = 0;
s = s[3:len(s)];
for s != "" {
@@ -829,20 +803,21 @@ defin(nt int, s string) int
case c >= '0' && c <= '9':
c -= '0';
case c >= 'a' && c <= 'f':
- c -= 'a' - 10;
+ c -= 'a'-10;
case c >= 'A' && c <= 'F':
- c -= 'A' - 10;
+ c -= 'A'-10;
default:
error("illegal \\unnnn construction");
}
- val = val * 16 + c;
+ val = val*16 + c;
s = s[1:len(s)];
}
if val == 0 {
error("'\\u0000' is illegal");
}
- } else
+ } else {
error("unknown escape");
+ }
} else {
val = extval;
extval++;
@@ -852,10 +827,9 @@ defin(nt int, s string) int
return ntokens;
}
-var peekline = 0;
-func
-gettok() int
-{
+var peekline = 0
+
+func gettok() int {
var i, match, c int;
tokname = "";
@@ -903,7 +877,7 @@ gettok() int
error("unterminated < ... > clause");
}
- for i=1; i<=ntypes; i++ {
+ for i = 1; i <= ntypes; i++ {
if typeset[i] == tokname {
numbval = i;
if tokflag {
@@ -926,13 +900,12 @@ gettok() int
for {
c = getrune(finput);
if c == '\n' || c == EOF {
- error("illegal or missing ' or \"" );
+ error("illegal or missing ' or \"");
}
if c == '\\' {
tokname += string('\\');
c = getrune(finput);
- } else
- if c == match {
+ } else if c == match {
if tokflag {
fmt.Printf(">>> IDENTIFIER \"%v\" %v\n", tokname, lineno);
}
@@ -963,11 +936,11 @@ gettok() int
getword(c);
// find a reserved word
- for c=0; c < len(resrv); c++ {
+ 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);
+ resrv[c].value - PRIVATE, lineno);
}
return resrv[c].value;
}
@@ -975,13 +948,13 @@ gettok() int
error("invalid escape, or illegal reserved word: %v", tokname);
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9':
- numbval = c - '0';
+ numbval = c-'0';
for {
c = getrune(finput);
if !isdigit(c) {
break;
}
- numbval = numbval*10 + c-'0';
+ numbval = numbval*10 + c - '0';
}
ungetrune(finput, c);
if tokflag {
@@ -1026,9 +999,7 @@ gettok() int
return IDENTIFIER;
}
-func
-getword(c int)
-{
+func getword(c int) {
tokname = "";
for isword(c) || isdigit(c) || c == '_' || c == '.' || c == '$' {
tokname += string(c);
@@ -1040,9 +1011,7 @@ getword(c int)
//
// determine the type of a symbol
//
-func
-fdtype(t int) int
-{
+func fdtype(t int) int {
var v int;
var s string;
@@ -1059,18 +1028,16 @@ fdtype(t int) int
return v;
}
-func
-chfind(t int, s string) int
-{
+func chfind(t int, s string) int {
if s[0] == ' ' {
t = 0;
}
- for i:=0; i<=ntokens; i++ {
+ for i := 0; i <= ntokens; i++ {
if s == tokset[i].name {
return i;
}
}
- for i:=0; i<=nnonter; i++ {
+ for i := 0; i <= nnonter; i++ {
if s == nontrst[i].name {
return NTBASE+i;
}
@@ -1086,9 +1053,7 @@ chfind(t int, s string) int
//
// copy the union declaration to the output, and the define file if present
//
-func
-cpyunion()
-{
+func cpyunion() {
if !lflag {
fmt.Fprintf(ftable, "\n//line %v %v\n", lineno, infile);
@@ -1097,14 +1062,14 @@ cpyunion()
level := 0;
- out:
+out:
for {
c := getrune(finput);
if c == EOF {
error("EOF encountered while processing %%union");
}
putrune(ftable, c);
- switch(c) {
+ switch c {
case '\n':
lineno++;
case '{':
@@ -1128,9 +1093,7 @@ cpyunion()
//
// saves code between %{ and %}
//
-func
-cpycode()
-{
+func cpycode() {
lno := lineno;
c := getrune(finput);
@@ -1231,9 +1194,7 @@ cpycode()
// skip over comments
// skipcom is called after reading a '/'
//
-func
-skipcom() int
-{
+func skipcom() int {
var c int;
c = getrune(finput);
@@ -1254,7 +1215,7 @@ skipcom() int
nl := 0; // lines skipped
c = getrune(finput);
- l1:
+l1:
switch c {
case '*':
c = getrune(finput);
@@ -1274,25 +1235,22 @@ skipcom() int
return nl;
}
-func
-dumpprod(curprod []int, max int)
-{
+func dumpprod(curprod []int, max int) {
fmt.Printf("\n");
- for i:=0; i<max; i++ {
+ for i := 0; i < max; i++ {
p := curprod[i];
if p < 0 {
fmt.Printf("[%v] %v\n", i, p);
- } else
+ } else {
fmt.Printf("[%v] %v\n", i, symnam(p));
+ }
}
}
//
// copy action to the next ; or closing }
//
-func
-cpyact(curprod []int, max int)
-{
+func cpyact(curprod []int, max int) {
if !lflag {
fmt.Fprintf(ftable, "\n//line %v %v\n", lineno, infile);
@@ -1301,14 +1259,14 @@ cpyact(curprod []int, max int)
lno := lineno;
brac := 0;
- loop:
+loop:
for {
c := getrune(finput);
- swt:
+ swt:
switch c {
case ';':
- if(brac == 0) {
+ if brac == 0 {
putrune(ftable, c);
return;
}
@@ -1316,7 +1274,7 @@ cpyact(curprod []int, max int)
case '{':
if brac == 0 {
}
- putrune(ftable, '\t');
+ putrune(ftable, '\t');
brac++;
case '$':
@@ -1352,7 +1310,7 @@ cpyact(curprod []int, max int)
j := 0;
if isdigit(c) {
for isdigit(c) {
- j = j*10 + c-'0';
+ j = j*10 + c - '0';
c = getrune(finput);
}
ungetrune(finput, c);
@@ -1360,8 +1318,7 @@ cpyact(curprod []int, max int)
if j >= max {
error("Illegal use of $%v", j);
}
- } else
- if isword(c) || c == '_' || c == '.' {
+ } else if isword(c) || c == '_' || c == '.' {
// look for $name
ungetrune(finput, c);
if gettok() != IDENTIFIER {
@@ -1372,12 +1329,12 @@ cpyact(curprod []int, max int)
c = getrune(finput);
if c != '@' {
ungetrune(finput, c);
- } else
- if gettok() != NUMBER {
+ } else if gettok() != NUMBER {
error("@ must be followed by number");
- } else
+ } else {
fnd = numbval;
- for j=1; j<max; j++ {
+ }
+ for j = 1; j < max; j++ {
if tokn == curprod[j] {
fnd--;
if fnd <= 0 {
@@ -1444,8 +1401,7 @@ cpyact(curprod []int, max int)
if c == '\n' {
lineno++;
}
- } else
- if c == match {
+ } else if c == match {
break swt;
}
if c == '\n' {
@@ -1468,12 +1424,10 @@ cpyact(curprod []int, max int)
}
}
-func
-openup()
-{
+func openup() {
infile = flag.Arg(0);
finput = open(infile);
- if(finput == nil) {
+ if finput == nil {
error("cannot open %v", infile);
}
@@ -1499,15 +1453,14 @@ openup()
//
// return a pointer to the name of symbol i
//
-func
-symnam(i int) string
-{
+func symnam(i int) string {
var s string;
if i >= NTBASE {
s = nontrst[i-NTBASE].name;
- } else
+ } else {
s = tokset[i].name;
+ }
if s[0] == ' ' {
s = s[1:len(s)];
}
@@ -1517,10 +1470,8 @@ symnam(i int) string
//
// set elements 0 through n-1 to c
//
-func
-aryfil(v []int, n, c int)
-{
- for i:=0; i<n; i++ {
+func aryfil(v []int, n, c int) {
+ for i := 0; i < n; i++ {
v[i] = c;
}
}
@@ -1530,26 +1481,24 @@ aryfil(v []int, n, c int)
// The array pres points to these lists
// the array pyield has the lists: the total size is only NPROD+1
//
-func
-cpres()
-{
+func cpres() {
pres = make([][][]int, nnonter+1);
curres := make([][]int, nprod);
if false {
- for j:=0; j<=nnonter; j++ {
+ for j := 0; j <= nnonter; j++ {
fmt.Printf("nnonter[%v] = %v\n", j, nontrst[j].name);
}
- for j:=0; j<nprod; j++ {
+ 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++ {
+ fatfl = 0; // make undefined symbols nonfatal
+ for i := 0; i <= nnonter; i++ {
n := 0;
c := i+NTBASE;
- for j:=0; j<nprod; j++ {
+ for j := 0; j < nprod; j++ {
if prdptr[j][0] == c {
curres[n] = prdptr[j][1:len(prdptr[j])];
n++;
@@ -1560,7 +1509,7 @@ cpres()
continue;
}
pres[i] = make([][]int, n);
- for ll:=0; ll<n; ll++ {
+ for ll := 0; ll < n; ll++ {
pres[i][ll] = curres[ll];
}
}
@@ -1571,9 +1520,7 @@ cpres()
}
}
-func
-dumppres()
-{
+func dumppres() {
for i := 0; i <= nnonter; i++ {
print("nonterm %d\n", i);
curres := pres[i];
@@ -1592,9 +1539,7 @@ dumppres()
// mark nonterminals which derive the empty string
// also, look for nonterminals which don't derive any token strings
//
-func
-cempty()
-{
+func cempty() {
var i, p, np int;
var prd []int;
@@ -1605,14 +1550,14 @@ cempty()
aryfil(pempty, nnonter+1, WHOKNOWS);
// now, look at productions, marking nonterminals which derive something
- more:
+more:
for {
- for i=0; i<nprod; i++ {
+ for i = 0; i < nprod; i++ {
prd = prdptr[i];
- if pempty[prd[0] - NTBASE] != 0 {
+ if pempty[prd[0]-NTBASE] != 0 {
continue;
}
- np = len(prd) - 1;
+ np = len(prd)-1;
for p = 1; p < np; p++ {
if prd[p] >= NTBASE && pempty[prd[p]-NTBASE] == WHOKNOWS {
break;
@@ -1628,7 +1573,7 @@ cempty()
}
// now, look at the nonterminals, to see if they are all OK
- for i=0; i<=nnonter; i++ {
+ for i = 0; i <= nnonter; i++ {
// the added production rises or falls as the start symbol ...
if i == 0 {
continue;
@@ -1650,16 +1595,16 @@ cempty()
// loop as long as we keep finding empty nonterminals
- again:
+again:
for {
- next:
- for i=1; i<nprod; i++ {
+ 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;
+ np = len(prd)-1;
for p = 1; p < np; p++ {
if prd[p] < NTBASE || pempty[prd[p]-NTBASE] != EMPTY {
continue next;
@@ -1676,9 +1621,7 @@ cempty()
}
}
-func
-dumpempty()
-{
+func dumpempty() {
for i := 0; i <= nnonter; i++ {
if pempty[i] == EMPTY {
print("non-term %d %s matches empty\n", i, symnam(i+NTBASE));
@@ -1689,16 +1632,14 @@ dumpempty()
//
// compute an array with the first of nonterminals
//
-func
-cpfir()
-{
+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++ {
+ for i = 0; i <= nnonter; i++ {
wsets[i].ws = mkset();
pfirst[i] = mkset();
curres = pres[i];
@@ -1707,7 +1648,7 @@ cpfir()
// initially fill the sets
for s = 0; s < n; s++ {
prd = curres[s];
- np = len(prd) - 1;
+ np = len(prd)-1;
for p = 0; p < np; p++ {
ch = prd[p];
if ch < NTBASE {
@@ -1725,14 +1666,14 @@ cpfir()
changes := 1;
for changes != 0 {
changes = 0;
- for i=0; i<=nnonter; i++ {
+ 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;
+ np = len(prd)-1;
for p = 0; p < np; p++ {
- ch = prd[p] - NTBASE;
+ ch = prd[p]-NTBASE;
if ch < 0 {
break;
}
@@ -1749,7 +1690,7 @@ cpfir()
return;
}
if foutput != nil {
- for i=0; i<=nnonter; i++ {
+ for i = 0; i <= nnonter; i++ {
fmt.Fprintf(foutput, "\n%v: %v %v\n",
nontrst[i].name, pfirst[i], pempty[i]);
}
@@ -1759,9 +1700,7 @@ cpfir()
//
// generate the states
//
-func
-stagen()
-{
+func stagen() {
// initialize
nstate = 0;
tstates = make([]int, ntokens+1); // states generated by terminal gotos
@@ -1788,7 +1727,7 @@ stagen()
first := 1;
for more := 1; more != 0; first = 0 {
more = 0;
- for i:=0; i<nstate; i++ {
+ for i := 0; i < nstate; i++ {
if tystate[i] != MUSTDO {
continue;
}
@@ -1800,7 +1739,7 @@ stagen()
closure(i);
// generate goto's
- for p:=0; p<cwp; p++ {
+ for p := 0; p < cwp; p++ {
pi := wsets[p];
if pi.flag != 0 {
continue;
@@ -1816,7 +1755,7 @@ stagen()
// do a goto on c
putitem(wsets[p].pitem, wsets[p].ws);
- for q:=p+1; q<cwp; q++ {
+ 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);
@@ -1826,13 +1765,14 @@ stagen()
if c < NTBASE {
state(c); // register new state
- } else
+ } else {
temp1[c-NTBASE] = state(c);
+ }
}
if gsdebug != 0 && foutput != nil {
fmt.Fprintf(foutput, "%v: ", i);
- for j:=0; j<=nnonter; j++ {
+ for j := 0; j <= nnonter; j++ {
if temp1[j] != 0 {
fmt.Fprintf(foutput, "%v %v,", nontrst[j].name, temp1[j]);
}
@@ -1852,18 +1792,16 @@ stagen()
//
// generate the closure of state i
//
-func
-closure(i int)
-{
+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++ {
+ 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].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++;
@@ -1873,7 +1811,7 @@ closure(i int)
work := 1;
for work != 0 {
work = 0;
- for u:=0; u<cwp; u++ {
+ for u := 0; u < cwp; u++ {
if wsets[u].flag == 0 {
continue;
}
@@ -1890,7 +1828,7 @@ closure(i int)
aryfil(clset, tbitset, 0);
// find items involving c
- for v:=u; v<cwp; v++ {
+ for v := u; v < cwp; v++ {
if wsets[v].flag != 1 || wsets[v].pitem.first != c {
continue;
}
@@ -1930,7 +1868,7 @@ closure(i int)
curres := pres[c-NTBASE];
n := len(curres);
- nexts:
+ nexts:
// initially fill the sets
for s := 0; s < n; s++ {
prd := curres[s];
@@ -1939,12 +1877,12 @@ closure(i int)
// put these items into the closure
// is the item there
//
- for v:=0; v<cwp; v++ {
+ for v := 0; v < cwp; v++ {
// yes, it is there
if wsets[v].pitem.off == 0 &&
- aryeq(wsets[v].pitem.prod, prd) != 0 {
+ aryeq(wsets[v].pitem.prod, prd) != 0 {
if nolook == 0 &&
- setunion(wsets[v].ws, clset) != 0 {
+ setunion(wsets[v].ws, clset) != 0 {
wsets[v].flag = 1;
work = 1;
}
@@ -1955,7 +1893,7 @@ closure(i int)
// not there; make a new entry
if cwp >= len(wsets) {
awsets := make([]Wset, cwp+WSETINC);
- for ll:=0; ll<len(wsets); ll++ {
+ for ll := 0; ll < len(wsets); ll++ {
awsets[ll] = wsets[ll];
}
wsets = awsets;
@@ -1965,7 +1903,7 @@ closure(i int)
wsets[cwp].ws = mkset();
if nolook == 0 {
work = 1;
- for ll:=0; ll<len(wsets[cwp].ws); ll++ {
+ for ll := 0; ll < len(wsets[cwp].ws); ll++ {
wsets[cwp].ws[ll] = clset[ll];
}
}
@@ -1977,7 +1915,7 @@ closure(i int)
// 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++ {
+ for u := 0; u < cwp; u++ {
if wsets[u].flag != 0 {
fmt.Fprintf(foutput, "flag set\n");
}
@@ -1992,9 +1930,7 @@ closure(i int)
//
// sorts last state,and sees if it equals earlier ones. returns state number
//
-func
-state(c int) int
-{
+func state(c int) int {
zzstate++;
p1 := pstate[nstate];
p2 := pstate[nstate+1];
@@ -2006,38 +1942,40 @@ state(c int) int
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) {
+ 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
+ } else {
break;
+ }
}
}
- size1 := p2 - p1; // size of state
+ size1 := p2-p1; // size of state
var i int;
if c >= NTBASE {
i = ntstates[c-NTBASE];
- } else
+ } else {
i = tstates[c];
+ }
- look:
+look:
for ; i != 0; i = mstates[i] {
// get ith state
q1 := pstate[i];
q2 := pstate[i+1];
- size2 := q2 - q1;
+ 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 {
+ statemem[l].pitem.off != statemem[k].pitem.off {
continue look;
}
k++;
@@ -2081,9 +2019,7 @@ state(c int) int
return nstate-1;
}
-func
-putitem(p Pitem, set Lkset)
-{
+func putitem(p Pitem, set Lkset) {
p.off++;
p.first = p.prod[p.off];
@@ -2093,7 +2029,7 @@ putitem(p Pitem, set Lkset)
j := pstate[nstate+1];
if j >= len(statemem) {
asm := make([]Item, j+STATEINC);
- for ll:=0; ll<len(statemem); ll++ {
+ for ll := 0; ll < len(statemem); ll++ {
asm[ll] = statemem[ll];
}
statemem = asm;
@@ -2101,7 +2037,7 @@ putitem(p Pitem, set Lkset)
statemem[j].pitem = p;
if nolook == 0 {
s := mkset();
- for ll:=0; ll<len(set); ll++ {
+ for ll := 0; ll < len(set); ll++ {
s[ll] = set[ll];
}
statemem[j].look = s;
@@ -2113,13 +2049,11 @@ putitem(p Pitem, set Lkset)
//
// creates output string for item pointed to by pp
//
-func
-writem(pp Pitem) string
-{
+func writem(pp Pitem) string {
var i int;
p := pp.prod;
- q := chcopy(nontrst[prdptr[pp.prodno][0]-NTBASE].name) + ": ";
+ q := chcopy(nontrst[prdptr[pp.prodno][0]-NTBASE].name)+": ";
npi := pp.off;
pi := aryeq(p, prdptr[pp.prodno]);
@@ -2151,9 +2085,7 @@ writem(pp Pitem) string
//
// pack state i from temp1 into amem
//
-func
-apack(p []int, n int) int
-{
+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...
@@ -2165,18 +2097,18 @@ apack(p []int, n int) int
off--;
}
- // no actions
+ // no actions
if pp > n {
return 0;
}
for ; n > pp && p[n] == 0; n-- {
}
- p = p[pp:n+1];
+ p = p[pp : n+1];
// now, find a place for the elements from p to q, inclusive
- r := len(amem) - len(p);
+ r := len(amem)-len(p);
- nextk:
+nextk:
for rr := 0; rr <= r; rr++ {
qq := rr;
for pp = 0; pp < len(p); pp++ {
@@ -2211,7 +2143,7 @@ apack(p []int, n int) int
fmt.Fprintf(foutput, "\n");
}
}
- return off + rr;
+ return off+rr;
}
error("no space in action table");
return 0;
@@ -2220,9 +2152,7 @@ apack(p []int, n int) int
//
// print the output for the states
//
-func
-output()
-{
+func output() {
var c, u, v int;
fmt.Fprintf(ftable, "var\tYYEXCA = []int {\n");
@@ -2230,7 +2160,7 @@ output()
noset := mkset();
// output the stuff for state i
- for i:=0; i<nstate; i++ {
+ for i := 0; i < nstate; i++ {
nolook = 0;
if tystate[i] != MUSTLOOKAHEAD {
nolook = 1;
@@ -2240,19 +2170,18 @@ output()
// output actions
nolook = 1;
aryfil(temp1, ntokens+nnonter+1, 0);
- for u=0; u<cwp; u++ {
+ 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++ {
+ 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 {
+ } else if c > NTBASE {
c -= NTBASE;
- if temp1[c + ntokens] == 0 {
+ if temp1[c+ntokens] == 0 {
temp1[c+ntokens] = amem[indgo[i]+c];
}
}
@@ -2263,7 +2192,7 @@ output()
// now, we have the shifts; look at the reductions
lastred = 0;
- for u=0; u<cwp; u++ {
+ for u = 0; u < cwp; u++ {
c = wsets[u].pitem.first;
// reduction
@@ -2272,27 +2201,27 @@ output()
}
lastred = -c;
us := wsets[u].ws;
- for k:=0; k<=ntokens; k++ {
+ 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
+ } 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",
+ "%v and %v) on %v",
i, -temp1[k], lastred, symnam(k));
}
if -temp1[k] > lastred {
temp1[k] = -lastred;
}
zzrrconf++;
- } else
+ } else {
// potential shift/reduce conflict
precftn(lastred, k, i);
+ }
}
}
wract(i);
@@ -2311,9 +2240,7 @@ output()
// the conflict is in state s
// temp1[t] is changed to reflect the action
//
-func
-precftn(r, t, s int)
-{
+func precftn(r, t, s int) {
var action int;
lp := levprd[r];
@@ -2330,15 +2257,15 @@ precftn(r, t, s int)
}
if PLEVEL(lt) == PLEVEL(lp) {
action = ASSOC(lt);
- } else
- if PLEVEL(lt) > PLEVEL(lp) {
- action = RASC; // shift
- } else
- action = LASC; // reduce
+ } else if PLEVEL(lt) > PLEVEL(lp) {
+ action = RASC; // shift
+ } else {
+ action = LASC;
+ } // reduce
switch action {
- case BASC: // error action
+ case BASC: // error action
temp1[t] = ERRCODE;
- case LASC: // reduce
+ case LASC: // reduce
temp1[t] = -r;
}
}
@@ -2347,15 +2274,13 @@ precftn(r, t, s int)
// output state i
// temp1 has the actions, lastred the default
//
-func
-wract(i int)
-{
+func wract(i int) {
var p, p1 int;
// find the best choice for lastred
lastred = 0;
ntimes := 0;
- for j:=0; j<=ntokens; j++ {
+ for j := 0; j <= ntokens; j++ {
if temp1[j] >= 0 {
continue;
}
@@ -2366,7 +2291,7 @@ wract(i int)
count := 0;
tred := -temp1[j];
levprd[tred] |= REDFLAG;
- for p=0; p<=ntokens; p++ {
+ for p = 0; p <= ntokens; p++ {
if temp1[p]+tred == 0 {
count++;
}
@@ -2388,7 +2313,7 @@ wract(i int)
// clear out entries in temp1 which equal lastred
// count entries in optst table
n := 0;
- for p=0; p<=ntokens; p++ {
+ for p = 0; p <= ntokens; p++ {
p1 = temp1[p];
if p1+lastred == 0 {
temp1[p] = 0;
@@ -2404,16 +2329,14 @@ wract(i int)
flag := 0;
os := make([]int, n*2);
n = 0;
- for p=0; p<=ntokens; p++ {
+ for p = 0; p <= ntokens; p++ {
p1 = temp1[p];
if p1 != 0 {
if p1 < 0 {
p1 = -p1;
- } else
- if p1 == ACCEPTCODE {
+ } else if p1 == ACCEPTCODE {
p1 = -1;
- } else
- if p1 == ERRCODE {
+ } else if p1 == ERRCODE {
p1 = 0;
} else {
os[n] = p;
@@ -2441,9 +2364,7 @@ wract(i int)
//
// writes state i
//
-func
-wrstate(i int)
-{
+func wrstate(i int) {
var j0, j1, u int;
var pp, qq int;
@@ -2452,12 +2373,12 @@ wrstate(i int)
}
fmt.Fprintf(foutput, "\nstate %v\n", i);
qq = pstate[i+1];
- for pp=pstate[i]; pp<qq; pp++ {
+ 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++ {
+ 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));
}
@@ -2465,7 +2386,7 @@ wrstate(i int)
}
// check for state equal to another
- for j0=0; j0<=ntokens; j0++ {
+ for j0 = 0; j0 <= ntokens; j0++ {
j1 = temp1[j0];
if j1 != 0 {
fmt.Fprintf(foutput, "\n\t%v ", symnam(j0));
@@ -2474,13 +2395,14 @@ wrstate(i int)
if j1 > 0 {
if j1 == ACCEPTCODE {
fmt.Fprintf(foutput, "accept");
- } else
- if j1 == ERRCODE {
+ } else if j1 == ERRCODE {
fmt.Fprintf(foutput, "error");
- } else
+ } else {
fmt.Fprintf(foutput, "shift %v", j1);
- } else
+ }
+ } else {
fmt.Fprintf(foutput, "reduce %v (src line %v)", -j1, rlines[-j1]);
+ }
}
}
@@ -2488,8 +2410,9 @@ wrstate(i int)
if lastred != 0 {
fmt.Fprintf(foutput, "\n\t. reduce %v (src line %v)\n\n",
lastred, rlines[lastred]);
- } else
+ } else {
fmt.Fprintf(foutput, "\n\t. error\n\n");
+ }
// now, output nonterminal actions
j1 = ntokens;
@@ -2504,9 +2427,7 @@ wrstate(i int)
//
// output the gotos for the nontermninals
//
-func
-go2out()
-{
+func go2out() {
for i := 1; i <= nnonter; i++ {
go2gen(i);
@@ -2545,7 +2466,7 @@ go2out()
n++;
}
}
- goent := make([]int, 2*n+1);
+ goent := make([]int, 2*n + 1);
n = 0;
for j := 0; j < nstate; j++ {
if tystate[j] != 0 && tystate[j] != best {
@@ -2571,9 +2492,7 @@ go2out()
//
// output the gotos for nonterminal c
//
-func
-go2gen(c int)
-{
+func go2gen(c int) {
var i, cc, p, q int;
// first, find nonterminals with gotos on c
@@ -2582,15 +2501,15 @@ go2gen(c int)
work := 1;
for work != 0 {
work = 0;
- for i=0; i<nprod; i++ {
+ 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;
+ work = 1;
+ temp1[cc] = 1;
}
}
}
@@ -2599,7 +2518,7 @@ go2gen(c int)
// 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++ {
+ for i = 0; i <= nnonter; i++ {
if temp1[i] != 0 {
fmt.Fprintf(foutput, "%v ", nontrst[i].name);
}
@@ -2609,9 +2528,9 @@ go2gen(c int)
// now, go through and put gotos into tystate
aryfil(tystate, nstate, 0);
- for i=0; i<nstate; i++ {
+ for i = 0; i < nstate; i++ {
q = pstate[i+1];
- for p=pstate[i]; p<q; p++ {
+ for p = pstate[i]; p < q; p++ {
cc = statemem[p].pitem.first;
if cc >= NTBASE {
// goto on c is possible
@@ -2630,13 +2549,11 @@ go2gen(c int)
// the action array is known, we hide the nonterminals
// derived by productions in levprd.
//
-func
-hideprod()
-{
+func hideprod() {
nred := 0;
levprd[0] = 0;
- for i:=1; i<nprod; i++ {
- if (levprd[i] & REDFLAG) == 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}));
@@ -2644,16 +2561,14 @@ hideprod()
fmt.Printf("rule %v never reduced\n", writem(Pitem{prdptr[i], 0, 0, i}));
nred++;
}
- levprd[i] = prdptr[i][0] - NTBASE;
+ levprd[i] = prdptr[i][0]-NTBASE;
}
if nred != 0 {
fmt.Printf("%v rules never reduced\n", nred);
}
}
-func
-callopt()
-{
+func callopt() {
var j, k, p, q, i int;
var v []int;
@@ -2678,7 +2593,7 @@ callopt()
// nontrivial situation
if k <= j {
// j is now the range
-// j -= k; // call scj
+ // j -= k; // call scj
if k > maxoff {
maxoff = k;
}
@@ -2697,8 +2612,8 @@ callopt()
// minimum entry index is always 0
v = yypgo[i];
- q = len(v) - 1;
- for p = 0; p < q ; p += 2 {
+ q = len(v)-1;
+ for p = 0; p < q; p += 2 {
ggreed[i] += 2;
if v[p] > j {
j = v[p];
@@ -2726,8 +2641,9 @@ callopt()
for i != NOMORE {
if i >= 0 {
stin(i);
- } else
+ } else {
gin(-i);
+ }
i = nxti();
}
@@ -2749,9 +2665,7 @@ callopt()
//
// finds the next i
//
-func
-nxti() int
-{
+func nxti() int {
max := 0;
maxi := 0;
for i := 1; i <= nnonter; i++ {
@@ -2772,25 +2686,23 @@ nxti() int
return maxi;
}
-func
-gin(i int)
-{
+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;
+ nq := len(q)-1;
// now, find amem place for it
- nextgp:
+nextgp:
for p := 0; p < ACTSIZE; p++ {
if amem[p] != 0 {
continue;
}
for r := 0; r < nq; r += 2 {
- s = p + q[r] + 1;
+ s = p+q[r]+1;
if s > maxa {
maxa = s;
if maxa >= ACTSIZE {
@@ -2808,7 +2720,7 @@ gin(i int)
maxa = p;
}
for r := 0; r < nq; r += 2 {
- s = p + q[r] + 1;
+ s = p+q[r]+1;
amem[s] = q[r+1];
}
pgo[i] = p;
@@ -2820,9 +2732,7 @@ gin(i int)
error("cannot place goto %v\n", i);
}
-func
-stin(i int)
-{
+func stin(i int) {
var s int;
tystate[i] = 0;
@@ -2831,25 +2741,24 @@ stin(i int)
q := optst[i];
nq := len(q);
- nextn:
+nextn:
// find an acceptable place
for n := -maxoff; n < ACTSIZE; n++ {
flag := 0;
for r := 0; r < nq; r += 2 {
- s = q[r] + n;
+ s = q[r]+n;
if s < 0 || s > ACTSIZE {
continue nextn;
}
if amem[s] == 0 {
flag++;
- } else
- if amem[s] != q[r+1] {
+ } 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++ {
+ for j := 0; j < nstate; j++ {
if indgo[j] == n {
// we have some disagreement
@@ -2862,7 +2771,8 @@ stin(i int)
indgo[i] = n;
if adb > 1 {
fmt.Fprintf(ftable, "State %v: entry at"
- "%v equals state %v\n", i, n, j);
+ "%v equals state %v\n",
+ i, n, j);
}
return;
}
@@ -2873,7 +2783,7 @@ stin(i int)
}
for r := 0; r < nq; r += 2 {
- s = q[r] + n;
+ s = q[r]+n;
if s > maxa {
maxa = s;
}
@@ -2895,10 +2805,8 @@ stin(i int)
// this version is for limbo
// write out the optimized parser
//
-func
-aoutput()
-{
- fmt.Fprintf(ftable, "const\tYYLAST\t= %v\n",maxa+1);
+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);
@@ -2907,9 +2815,7 @@ aoutput()
//
// put out other arrays, copy the parsers
//
-func
-others()
-{
+func others() {
var i, j int;
arout("YYR1", levprd, nprod);
@@ -2918,19 +2824,19 @@ others()
//
//yyr2 is the number of rules for each production
//
- for i=1; i<nprod; i++ {
- temp1[i] = len(prdptr[i]) - 2;
+ 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] {
+ 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] {
+ for i = 0; i <= nnonter; i++ {
+ for j = ntstates[i]; j != 0; j = mstates[j] {
temp1[j] = -i;
}
}
@@ -2941,7 +2847,7 @@ others()
// table 1 has 0-256
aryfil(temp1, 256, 0);
c := 0;
- for i=1; i<=ntokens; i++ {
+ for i = 1; i <= ntokens; i++ {
j = tokset[i].value;
if j >= 0 && j < 256 {
if temp1[j] != 0 {
@@ -2965,7 +2871,7 @@ others()
// table 2 has PRIVATE-PRIVATE+256
aryfil(temp1, 256, 0);
c = 0;
- for i=1; i<=ntokens; i++ {
+ for i = 1; i <= ntokens; i++ {
j = tokset[i].value - PRIVATE;
if j >= 0 && j < 256 {
if temp1[j] != 0 {
@@ -2984,7 +2890,7 @@ others()
// table 3 has everything else
fmt.Fprintf(ftable, "var\tYYTOK3\t= []int {\n");
c = 0;
- for i=1; i<=ntokens; i++ {
+ for i = 1; i <= ntokens; i++ {
j = tokset[i].value;
if j >= 0 && j < 256 {
continue;
@@ -3012,9 +2918,7 @@ others()
fmt.Fprintf(ftable, "%v", yaccpar);
}
-func
-arout(s string, v []int, n int)
-{
+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 {
@@ -3029,10 +2933,8 @@ arout(s string, v []int, n int)
//
// output the summary on y.output
//
-func
-summary()
-{
- if(foutput != nil) {
+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);
@@ -3061,9 +2963,7 @@ summary()
//
// write optimizer summary
//
-func
-osummary()
-{
+func osummary() {
if foutput == nil {
return;
}
@@ -3082,43 +2982,33 @@ osummary()
//
// copies and protects "'s in q
//
-func
-chcopy(q string) string
-{
+func chcopy(q string) string {
s := "";
i := 0;
j := 0;
for i = 0; i < len(q); i++ {
if q[i] == '"' {
- s += q[j:i] + "\\";
+ s += q[j:i]+"\\";
j = i;
}
}
- return s + q[j:i];
+ return s+q[j:i];
}
-func
-usage()
-{
+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 bitset(set Lkset, bit int) int {
+ return set[bit>>5]&(1<<uint(bit&31));
}
-func
-setbit(set Lkset, bit int)
-{
+func setbit(set Lkset, bit int) {
set[bit>>5] |= (1<<uint(bit&31));
}
-func
-mkset() Lkset
-{
+func mkset() Lkset {
return make([]int, tbitset);
}
@@ -3126,13 +3016,11 @@ mkset() Lkset
// 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
-{
+func setunion(a, b []int) int {
sub := 0;
- for i:=0; i<tbitset; i++ {
+ for i := 0; i < tbitset; i++ {
x := a[i];
- y := x | b[i];
+ y := x|b[i];
a[i] = y;
if y != x {
sub = 1;
@@ -3141,15 +3029,13 @@ setunion(a, b []int) int
return sub;
}
-func
-prlook(p Lkset)
-{
+func prlook(p Lkset) {
if p == nil {
fmt.Fprintf(foutput, "\tNULL");
return;
}
fmt.Fprintf(foutput, " { ");
- for j:=0; j<=ntokens; j++ {
+ for j := 0; j <= ntokens; j++ {
if bitset(p, j) != 0 {
fmt.Fprintf(foutput, "%v ", symnam(j));
}
@@ -3160,23 +3046,17 @@ prlook(p Lkset)
//
// utility routines
//
-var peekrune int;
+var peekrune int
-func
-isdigit(c int) bool
-{
+func isdigit(c int) bool {
return c >= '0' && c <= '9';
}
-func
-isword(c int) bool
-{
+func isword(c int) bool {
return c >= 0xa0 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}
-func
-mktemp(t string) string
-{
+func mktemp(t string) string {
return t;
}
@@ -3184,14 +3064,12 @@ mktemp(t string) string
// return 1 if 2 arrays are equal
// return 0 if not equal
//
-func
-aryeq(a []int, b[]int) int
-{
+func aryeq(a []int, b []int) int {
n := len(a);
if len(b) != n {
return 0;
}
- for ll:=0; ll<n; ll++ {
+ for ll := 0; ll < n; ll++ {
if a[ll] != b[ll] {
return 0;
}
@@ -3199,18 +3077,14 @@ aryeq(a []int, b[]int) int
return 1;
}
-func
-putrune(f *bufio.Writer, c int)
-{
+func putrune(f *bufio.Writer, c int) {
s := string(c);
- for i:=0; i<len(s); i++ {
+ for i := 0; i < len(s); i++ {
f.WriteByte(s[i]);
}
}
-func
-getrune(f *bufio.Reader) int
-{
+func getrune(f *bufio.Reader) int {
var r int;
if peekrune != 0 {
@@ -3222,20 +3096,18 @@ getrune(f *bufio.Reader) int
return r;
}
- c,n,err := f.ReadRune();
+ 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);
+ //fmt.Printf("rune = %v n=%v\n", string(c), n);
return c;
}
-func
-ungetrune(f *bufio.Reader, c int)
-{
+func ungetrune(f *bufio.Reader, c int) {
if f != finput {
panic("ungetc - not finput");
}
@@ -3245,41 +3117,33 @@ ungetrune(f *bufio.Reader, c int)
peekrune = c;
}
-func
-write(f *bufio.Writer, b []byte, n int) int
-{
+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);
+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);
+ //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);
+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);
+ //fmt.Printf("create %v mode %v\n", s, m);
return bufio.NewWriter(fo);
}
//
// write out error comment
//
-func
-error(s string, v ...)
-{
+func error(s string, v ...) {
nerrors++;
fmt.Fprintf(stderr, s, v);
fmt.Fprintf(stderr, ": %v:%v\n", infile, lineno);
@@ -3289,9 +3153,7 @@ error(s string, v ...)
}
}
-func
-exit(status int)
-{
+func exit(status int) {
if ftable != nil {
ftable.Flush();
ftable = nil;
@@ -3307,7 +3169,7 @@ exit(status int)
os.Exit(status);
}
-var yaccpar =
+var yaccpar =
// from here to the end of the file is
// a single string containing the old yaccpar file
`