1  
     2  
     3  
     4  
     5  package syntax
     6  
     7  import (
     8  	"fmt"
     9  	"go/build/constraint"
    10  	"io"
    11  	"strconv"
    12  	"strings"
    13  )
    14  
    15  const debug = false
    16  const trace = false
    17  
    18  type parser struct {
    19  	file  *PosBase
    20  	errh  ErrorHandler
    21  	mode  Mode
    22  	pragh PragmaHandler
    23  	scanner
    24  
    25  	base      *PosBase 
    26  	first     error    
    27  	errcnt    int      
    28  	pragma    Pragma   
    29  	goVersion string   
    30  
    31  	top    bool   
    32  	fnest  int    
    33  	xnest  int    
    34  	indent []byte 
    35  }
    36  
    37  func (p *parser) init(file *PosBase, r io.Reader, errh ErrorHandler, pragh PragmaHandler, mode Mode) {
    38  	p.top = true
    39  	p.file = file
    40  	p.errh = errh
    41  	p.mode = mode
    42  	p.pragh = pragh
    43  	p.scanner.init(
    44  		r,
    45  		
    46  		
    47  		
    48  		
    49  		
    50  		func(line, col uint, msg string) {
    51  			if msg[0] != '/' {
    52  				p.errorAt(p.posAt(line, col), msg)
    53  				return
    54  			}
    55  
    56  			
    57  			
    58  			
    59  			text := commentText(msg)
    60  			if (col == colbase || msg[1] == '*') && strings.HasPrefix(text, "line ") {
    61  				var pos Pos 
    62  				if msg[1] == '/' {
    63  					
    64  					pos = MakePos(p.file, line+1, colbase)
    65  				} else {
    66  					
    67  					
    68  					
    69  					
    70  					pos = MakePos(p.file, line, col+uint(len(msg)))
    71  				}
    72  				p.updateBase(pos, line, col+2+5, text[5:]) 
    73  				return
    74  			}
    75  
    76  			
    77  			if strings.HasPrefix(text, "go:") {
    78  				if p.top && strings.HasPrefix(msg, "//go:build") {
    79  					if x, err := constraint.Parse(msg); err == nil {
    80  						p.goVersion = constraint.GoVersion(x)
    81  					}
    82  				}
    83  				if pragh != nil {
    84  					p.pragma = pragh(p.posAt(line, col+2), p.scanner.blank, text, p.pragma) 
    85  				}
    86  			}
    87  		},
    88  		directives,
    89  	)
    90  
    91  	p.base = file
    92  	p.first = nil
    93  	p.errcnt = 0
    94  	p.pragma = nil
    95  
    96  	p.fnest = 0
    97  	p.xnest = 0
    98  	p.indent = nil
    99  }
   100  
   101  
   102  
   103  func (p *parser) takePragma() Pragma {
   104  	prag := p.pragma
   105  	p.pragma = nil
   106  	return prag
   107  }
   108  
   109  
   110  
   111  
   112  
   113  func (p *parser) clearPragma() {
   114  	if p.pragma != nil {
   115  		p.pragh(p.pos(), p.scanner.blank, "", p.pragma)
   116  		p.pragma = nil
   117  	}
   118  }
   119  
   120  
   121  
   122  
   123  func (p *parser) updateBase(pos Pos, tline, tcol uint, text string) {
   124  	i, n, ok := trailingDigits(text)
   125  	if i == 0 {
   126  		return 
   127  	}
   128  	
   129  
   130  	if !ok {
   131  		
   132  		p.errorAt(p.posAt(tline, tcol+i), "invalid line number: "+text[i:])
   133  		return
   134  	}
   135  
   136  	var line, col uint
   137  	i2, n2, ok2 := trailingDigits(text[:i-1])
   138  	if ok2 {
   139  		
   140  		i, i2 = i2, i
   141  		line, col = n2, n
   142  		if col == 0 || col > PosMax {
   143  			p.errorAt(p.posAt(tline, tcol+i2), "invalid column number: "+text[i2:])
   144  			return
   145  		}
   146  		text = text[:i2-1] 
   147  	} else {
   148  		
   149  		line = n
   150  	}
   151  
   152  	if line == 0 || line > PosMax {
   153  		p.errorAt(p.posAt(tline, tcol+i), "invalid line number: "+text[i:])
   154  		return
   155  	}
   156  
   157  	
   158  	
   159  	filename := text[:i-1] 
   160  	trimmed := false
   161  	if filename == "" && ok2 {
   162  		filename = p.base.Filename()
   163  		trimmed = p.base.Trimmed()
   164  	}
   165  
   166  	p.base = NewLineBase(pos, filename, trimmed, line, col)
   167  }
   168  
   169  func commentText(s string) string {
   170  	if s[:2] == "/*" {
   171  		return s[2 : len(s)-2] 
   172  	}
   173  
   174  	
   175  	
   176  	i := len(s)
   177  	if s[i-1] == '\r' {
   178  		i--
   179  	}
   180  	return s[2:i] 
   181  }
   182  
   183  func trailingDigits(text string) (uint, uint, bool) {
   184  	i := strings.LastIndexByte(text, ':') 
   185  	if i < 0 {
   186  		return 0, 0, false 
   187  	}
   188  	
   189  	n, err := strconv.ParseUint(text[i+1:], 10, 0)
   190  	return uint(i + 1), uint(n), err == nil
   191  }
   192  
   193  func (p *parser) got(tok token) bool {
   194  	if p.tok == tok {
   195  		p.next()
   196  		return true
   197  	}
   198  	return false
   199  }
   200  
   201  func (p *parser) want(tok token) {
   202  	if !p.got(tok) {
   203  		p.syntaxError("expected " + tokstring(tok))
   204  		p.advance()
   205  	}
   206  }
   207  
   208  
   209  
   210  func (p *parser) gotAssign() bool {
   211  	switch p.tok {
   212  	case _Define:
   213  		p.syntaxError("expected =")
   214  		fallthrough
   215  	case _Assign:
   216  		p.next()
   217  		return true
   218  	}
   219  	return false
   220  }
   221  
   222  
   223  
   224  
   225  
   226  func (p *parser) posAt(line, col uint) Pos {
   227  	return MakePos(p.base, line, col)
   228  }
   229  
   230  
   231  func (p *parser) errorAt(pos Pos, msg string) {
   232  	err := Error{pos, msg}
   233  	if p.first == nil {
   234  		p.first = err
   235  	}
   236  	p.errcnt++
   237  	if p.errh == nil {
   238  		panic(p.first)
   239  	}
   240  	p.errh(err)
   241  }
   242  
   243  
   244  func (p *parser) syntaxErrorAt(pos Pos, msg string) {
   245  	if trace {
   246  		p.print("syntax error: " + msg)
   247  	}
   248  
   249  	if p.tok == _EOF && p.first != nil {
   250  		return 
   251  	}
   252  
   253  	
   254  	switch {
   255  	case msg == "":
   256  		
   257  	case strings.HasPrefix(msg, "in "), strings.HasPrefix(msg, "at "), strings.HasPrefix(msg, "after "):
   258  		msg = " " + msg
   259  	case strings.HasPrefix(msg, "expected "):
   260  		msg = ", " + msg
   261  	default:
   262  		
   263  		p.errorAt(pos, "syntax error: "+msg)
   264  		return
   265  	}
   266  
   267  	
   268  	var tok string
   269  	switch p.tok {
   270  	case _Name:
   271  		tok = "name " + p.lit
   272  	case _Semi:
   273  		tok = p.lit
   274  	case _Literal:
   275  		tok = "literal " + p.lit
   276  	case _Operator:
   277  		tok = p.op.String()
   278  	case _AssignOp:
   279  		tok = p.op.String() + "="
   280  	case _IncOp:
   281  		tok = p.op.String()
   282  		tok += tok
   283  	default:
   284  		tok = tokstring(p.tok)
   285  	}
   286  
   287  	
   288  	
   289  	p.errorAt(pos, "syntax error: unexpected "+tok+msg)
   290  }
   291  
   292  
   293  
   294  
   295  
   296  func tokstring(tok token) string {
   297  	switch tok {
   298  	case _Comma:
   299  		return "comma"
   300  	case _Semi:
   301  		return "semicolon or newline"
   302  	}
   303  	s := tok.String()
   304  	if _Break <= tok && tok <= _Var {
   305  		return "keyword " + s
   306  	}
   307  	return s
   308  }
   309  
   310  
   311  func (p *parser) pos() Pos               { return p.posAt(p.line, p.col) }
   312  func (p *parser) error(msg string)       { p.errorAt(p.pos(), msg) }
   313  func (p *parser) syntaxError(msg string) { p.syntaxErrorAt(p.pos(), msg) }
   314  
   315  
   316  
   317  
   318  const stopset uint64 = 1<<_Break |
   319  	1<<_Const |
   320  	1<<_Continue |
   321  	1<<_Defer |
   322  	1<<_Fallthrough |
   323  	1<<_For |
   324  	1<<_Go |
   325  	1<<_Goto |
   326  	1<<_If |
   327  	1<<_Return |
   328  	1<<_Select |
   329  	1<<_Switch |
   330  	1<<_Type |
   331  	1<<_Var
   332  
   333  
   334  
   335  
   336  
   337  func (p *parser) advance(followlist ...token) {
   338  	if trace {
   339  		p.print(fmt.Sprintf("advance %s", followlist))
   340  	}
   341  
   342  	
   343  	
   344  	var followset uint64 = 1 << _EOF 
   345  	if len(followlist) > 0 {
   346  		if p.fnest > 0 {
   347  			followset |= stopset
   348  		}
   349  		for _, tok := range followlist {
   350  			followset |= 1 << tok
   351  		}
   352  	}
   353  
   354  	for !contains(followset, p.tok) {
   355  		if trace {
   356  			p.print("skip " + p.tok.String())
   357  		}
   358  		p.next()
   359  		if len(followlist) == 0 {
   360  			break
   361  		}
   362  	}
   363  
   364  	if trace {
   365  		p.print("next " + p.tok.String())
   366  	}
   367  }
   368  
   369  
   370  func (p *parser) trace(msg string) func() {
   371  	p.print(msg + " (")
   372  	const tab = ". "
   373  	p.indent = append(p.indent, tab...)
   374  	return func() {
   375  		p.indent = p.indent[:len(p.indent)-len(tab)]
   376  		if x := recover(); x != nil {
   377  			panic(x) 
   378  		}
   379  		p.print(")")
   380  	}
   381  }
   382  
   383  func (p *parser) print(msg string) {
   384  	fmt.Printf("%5d: %s%s\n", p.line, p.indent, msg)
   385  }
   386  
   387  
   388  
   389  
   390  
   391  
   392  
   393  
   394  
   395  
   396  
   397  
   398  func (p *parser) fileOrNil() *File {
   399  	if trace {
   400  		defer p.trace("file")()
   401  	}
   402  
   403  	f := new(File)
   404  	f.pos = p.pos()
   405  
   406  	
   407  	f.GoVersion = p.goVersion
   408  	p.top = false
   409  	if !p.got(_Package) {
   410  		p.syntaxError("package statement must be first")
   411  		return nil
   412  	}
   413  	f.Pragma = p.takePragma()
   414  	f.PkgName = p.name()
   415  	p.want(_Semi)
   416  
   417  	
   418  	if p.first != nil {
   419  		return nil
   420  	}
   421  
   422  	
   423  	
   424  	prev := _Import
   425  	for p.tok != _EOF {
   426  		if p.tok == _Import && prev != _Import {
   427  			p.syntaxError("imports must appear before other declarations")
   428  		}
   429  		prev = p.tok
   430  
   431  		switch p.tok {
   432  		case _Import:
   433  			p.next()
   434  			f.DeclList = p.appendGroup(f.DeclList, p.importDecl)
   435  
   436  		case _Const:
   437  			p.next()
   438  			f.DeclList = p.appendGroup(f.DeclList, p.constDecl)
   439  
   440  		case _Type:
   441  			p.next()
   442  			f.DeclList = p.appendGroup(f.DeclList, p.typeDecl)
   443  
   444  		case _Var:
   445  			p.next()
   446  			f.DeclList = p.appendGroup(f.DeclList, p.varDecl)
   447  
   448  		case _Func:
   449  			p.next()
   450  			if d := p.funcDeclOrNil(); d != nil {
   451  				f.DeclList = append(f.DeclList, d)
   452  			}
   453  
   454  		default:
   455  			if p.tok == _Lbrace && len(f.DeclList) > 0 && isEmptyFuncDecl(f.DeclList[len(f.DeclList)-1]) {
   456  				
   457  				p.syntaxError("unexpected semicolon or newline before {")
   458  			} else {
   459  				p.syntaxError("non-declaration statement outside function body")
   460  			}
   461  			p.advance(_Import, _Const, _Type, _Var, _Func)
   462  			continue
   463  		}
   464  
   465  		
   466  		
   467  		p.clearPragma()
   468  
   469  		if p.tok != _EOF && !p.got(_Semi) {
   470  			p.syntaxError("after top level declaration")
   471  			p.advance(_Import, _Const, _Type, _Var, _Func)
   472  		}
   473  	}
   474  	
   475  
   476  	p.clearPragma()
   477  	f.EOF = p.pos()
   478  
   479  	return f
   480  }
   481  
   482  func isEmptyFuncDecl(dcl Decl) bool {
   483  	f, ok := dcl.(*FuncDecl)
   484  	return ok && f.Body == nil
   485  }
   486  
   487  
   488  
   489  
   490  
   491  
   492  
   493  
   494  
   495  
   496  
   497  
   498  
   499  func (p *parser) list(context string, sep, close token, f func() bool) Pos {
   500  	if debug && (sep != _Comma && sep != _Semi || close != _Rparen && close != _Rbrace && close != _Rbrack) {
   501  		panic("invalid sep or close argument for list")
   502  	}
   503  
   504  	done := false
   505  	for p.tok != _EOF && p.tok != close && !done {
   506  		done = f()
   507  		
   508  		if !p.got(sep) && p.tok != close {
   509  			p.syntaxError(fmt.Sprintf("in %s; possibly missing %s or %s", context, tokstring(sep), tokstring(close)))
   510  			p.advance(_Rparen, _Rbrack, _Rbrace)
   511  			if p.tok != close {
   512  				
   513  				return p.pos()
   514  			}
   515  		}
   516  	}
   517  
   518  	pos := p.pos()
   519  	p.want(close)
   520  	return pos
   521  }
   522  
   523  
   524  func (p *parser) appendGroup(list []Decl, f func(*Group) Decl) []Decl {
   525  	if p.tok == _Lparen {
   526  		g := new(Group)
   527  		p.clearPragma()
   528  		p.next() 
   529  		p.list("grouped declaration", _Semi, _Rparen, func() bool {
   530  			if x := f(g); x != nil {
   531  				list = append(list, x)
   532  			}
   533  			return false
   534  		})
   535  	} else {
   536  		if x := f(nil); x != nil {
   537  			list = append(list, x)
   538  		}
   539  	}
   540  	return list
   541  }
   542  
   543  
   544  
   545  func (p *parser) importDecl(group *Group) Decl {
   546  	if trace {
   547  		defer p.trace("importDecl")()
   548  	}
   549  
   550  	d := new(ImportDecl)
   551  	d.pos = p.pos()
   552  	d.Group = group
   553  	d.Pragma = p.takePragma()
   554  
   555  	switch p.tok {
   556  	case _Name:
   557  		d.LocalPkgName = p.name()
   558  	case _Dot:
   559  		d.LocalPkgName = NewName(p.pos(), ".")
   560  		p.next()
   561  	}
   562  	d.Path = p.oliteral()
   563  	if d.Path == nil {
   564  		p.syntaxError("missing import path")
   565  		p.advance(_Semi, _Rparen)
   566  		return d
   567  	}
   568  	if !d.Path.Bad && d.Path.Kind != StringLit {
   569  		p.syntaxErrorAt(d.Path.Pos(), "import path must be a string")
   570  		d.Path.Bad = true
   571  	}
   572  	
   573  
   574  	return d
   575  }
   576  
   577  
   578  func (p *parser) constDecl(group *Group) Decl {
   579  	if trace {
   580  		defer p.trace("constDecl")()
   581  	}
   582  
   583  	d := new(ConstDecl)
   584  	d.pos = p.pos()
   585  	d.Group = group
   586  	d.Pragma = p.takePragma()
   587  
   588  	d.NameList = p.nameList(p.name())
   589  	if p.tok != _EOF && p.tok != _Semi && p.tok != _Rparen {
   590  		d.Type = p.typeOrNil()
   591  		if p.gotAssign() {
   592  			d.Values = p.exprList()
   593  		}
   594  	}
   595  
   596  	return d
   597  }
   598  
   599  
   600  func (p *parser) typeDecl(group *Group) Decl {
   601  	if trace {
   602  		defer p.trace("typeDecl")()
   603  	}
   604  
   605  	d := new(TypeDecl)
   606  	d.pos = p.pos()
   607  	d.Group = group
   608  	d.Pragma = p.takePragma()
   609  
   610  	d.Name = p.name()
   611  	if p.tok == _Lbrack {
   612  		
   613  		
   614  		pos := p.pos()
   615  		p.next()
   616  		switch p.tok {
   617  		case _Name:
   618  			
   619  			
   620  			
   621  			
   622  			
   623  			
   624  			
   625  			
   626  			
   627  			
   628  			
   629  			
   630  			
   631  			
   632  			
   633  			var x Expr = p.name()
   634  			if p.tok != _Lbrack {
   635  				
   636  				
   637  				
   638  				p.xnest++
   639  				x = p.binaryExpr(p.pexpr(x, false), 0)
   640  				p.xnest--
   641  			}
   642  			
   643  			
   644  			
   645  			
   646  			
   647  			
   648  			
   649  			if pname, ptype := extractName(x, p.tok == _Comma); pname != nil && (ptype != nil || p.tok != _Rbrack) {
   650  				
   651  				
   652  				
   653  				d.TParamList = p.paramList(pname, ptype, _Rbrack, true, false) 
   654  				d.Alias = p.gotAssign()
   655  				d.Type = p.typeOrNil()
   656  			} else {
   657  				
   658  				
   659  				d.Type = p.arrayType(pos, x)
   660  			}
   661  		case _Rbrack:
   662  			
   663  			p.next()
   664  			d.Type = p.sliceType(pos)
   665  		default:
   666  			
   667  			d.Type = p.arrayType(pos, nil)
   668  		}
   669  	} else {
   670  		d.Alias = p.gotAssign()
   671  		d.Type = p.typeOrNil()
   672  	}
   673  
   674  	if d.Type == nil {
   675  		d.Type = p.badExpr()
   676  		p.syntaxError("in type declaration")
   677  		p.advance(_Semi, _Rparen)
   678  	}
   679  
   680  	return d
   681  }
   682  
   683  
   684  
   685  
   686  
   687  
   688  
   689  
   690  
   691  
   692  
   693  
   694  
   695  
   696  
   697  
   698  
   699  
   700  
   701  func extractName(x Expr, force bool) (*Name, Expr) {
   702  	switch x := x.(type) {
   703  	case *Name:
   704  		return x, nil
   705  	case *Operation:
   706  		if x.Y == nil {
   707  			break 
   708  		}
   709  		switch x.Op {
   710  		case Mul:
   711  			if name, _ := x.X.(*Name); name != nil && (force || isTypeElem(x.Y)) {
   712  				
   713  				op := *x
   714  				op.X, op.Y = op.Y, nil 
   715  				return name, &op
   716  			}
   717  		case Or:
   718  			if name, lhs := extractName(x.X, force || isTypeElem(x.Y)); name != nil && lhs != nil {
   719  				
   720  				op := *x
   721  				op.X = lhs
   722  				return name, &op
   723  			}
   724  		}
   725  	case *CallExpr:
   726  		if name, _ := x.Fun.(*Name); name != nil {
   727  			if len(x.ArgList) == 1 && !x.HasDots && (force || isTypeElem(x.ArgList[0])) {
   728  				
   729  				
   730  				
   731  				const keep_parens = false
   732  				if keep_parens {
   733  					
   734  					px := new(ParenExpr)
   735  					px.pos = x.pos 
   736  					px.X = x.ArgList[0]
   737  					return name, px
   738  				} else {
   739  					
   740  					return name, Unparen(x.ArgList[0])
   741  				}
   742  			}
   743  		}
   744  	}
   745  	return nil, x
   746  }
   747  
   748  
   749  
   750  func isTypeElem(x Expr) bool {
   751  	switch x := x.(type) {
   752  	case *ArrayType, *StructType, *FuncType, *InterfaceType, *SliceType, *MapType, *ChanType:
   753  		return true
   754  	case *Operation:
   755  		return isTypeElem(x.X) || (x.Y != nil && isTypeElem(x.Y)) || x.Op == Tilde
   756  	case *ParenExpr:
   757  		return isTypeElem(x.X)
   758  	}
   759  	return false
   760  }
   761  
   762  
   763  func (p *parser) varDecl(group *Group) Decl {
   764  	if trace {
   765  		defer p.trace("varDecl")()
   766  	}
   767  
   768  	d := new(VarDecl)
   769  	d.pos = p.pos()
   770  	d.Group = group
   771  	d.Pragma = p.takePragma()
   772  
   773  	d.NameList = p.nameList(p.name())
   774  	if p.gotAssign() {
   775  		d.Values = p.exprList()
   776  	} else {
   777  		d.Type = p.type_()
   778  		if p.gotAssign() {
   779  			d.Values = p.exprList()
   780  		}
   781  	}
   782  
   783  	return d
   784  }
   785  
   786  
   787  
   788  
   789  
   790  
   791  func (p *parser) funcDeclOrNil() *FuncDecl {
   792  	if trace {
   793  		defer p.trace("funcDecl")()
   794  	}
   795  
   796  	f := new(FuncDecl)
   797  	f.pos = p.pos()
   798  	f.Pragma = p.takePragma()
   799  
   800  	var context string
   801  	if p.got(_Lparen) {
   802  		context = "method"
   803  		rcvr := p.paramList(nil, nil, _Rparen, false, false)
   804  		switch len(rcvr) {
   805  		case 0:
   806  			p.error("method has no receiver")
   807  		default:
   808  			p.error("method has multiple receivers")
   809  			fallthrough
   810  		case 1:
   811  			f.Recv = rcvr[0]
   812  		}
   813  	}
   814  
   815  	if p.tok == _Name {
   816  		f.Name = p.name()
   817  		f.TParamList, f.Type = p.funcType(context)
   818  	} else {
   819  		f.Name = NewName(p.pos(), "_")
   820  		f.Type = new(FuncType)
   821  		f.Type.pos = p.pos()
   822  		msg := "expected name or ("
   823  		if context != "" {
   824  			msg = "expected name"
   825  		}
   826  		p.syntaxError(msg)
   827  		p.advance(_Lbrace, _Semi)
   828  	}
   829  
   830  	if p.tok == _Lbrace {
   831  		f.Body = p.funcBody()
   832  	}
   833  
   834  	return f
   835  }
   836  
   837  func (p *parser) funcBody() *BlockStmt {
   838  	p.fnest++
   839  	errcnt := p.errcnt
   840  	body := p.blockStmt("")
   841  	p.fnest--
   842  
   843  	
   844  	
   845  	
   846  	if p.mode&CheckBranches != 0 && errcnt == p.errcnt {
   847  		checkBranches(body, p.errh)
   848  	}
   849  
   850  	return body
   851  }
   852  
   853  
   854  
   855  
   856  func (p *parser) expr() Expr {
   857  	if trace {
   858  		defer p.trace("expr")()
   859  	}
   860  
   861  	return p.binaryExpr(nil, 0)
   862  }
   863  
   864  
   865  func (p *parser) binaryExpr(x Expr, prec int) Expr {
   866  	
   867  
   868  	if x == nil {
   869  		x = p.unaryExpr()
   870  	}
   871  	for (p.tok == _Operator || p.tok == _Star) && p.prec > prec {
   872  		t := new(Operation)
   873  		t.pos = p.pos()
   874  		t.Op = p.op
   875  		tprec := p.prec
   876  		p.next()
   877  		t.X = x
   878  		t.Y = p.binaryExpr(nil, tprec)
   879  		x = t
   880  	}
   881  	return x
   882  }
   883  
   884  
   885  func (p *parser) unaryExpr() Expr {
   886  	if trace {
   887  		defer p.trace("unaryExpr")()
   888  	}
   889  
   890  	switch p.tok {
   891  	case _Operator, _Star:
   892  		switch p.op {
   893  		case Mul, Add, Sub, Not, Xor, Tilde:
   894  			x := new(Operation)
   895  			x.pos = p.pos()
   896  			x.Op = p.op
   897  			p.next()
   898  			x.X = p.unaryExpr()
   899  			return x
   900  
   901  		case And:
   902  			x := new(Operation)
   903  			x.pos = p.pos()
   904  			x.Op = And
   905  			p.next()
   906  			
   907  			
   908  			x.X = Unparen(p.unaryExpr())
   909  			return x
   910  		}
   911  
   912  	case _Arrow:
   913  		
   914  		pos := p.pos()
   915  		p.next()
   916  
   917  		
   918  		
   919  		
   920  
   921  		x := p.unaryExpr()
   922  
   923  		
   924  		
   925  		
   926  		
   927  		
   928  		
   929  		
   930  		
   931  		
   932  		
   933  
   934  		if _, ok := x.(*ChanType); ok {
   935  			
   936  			dir := SendOnly
   937  			t := x
   938  			for dir == SendOnly {
   939  				c, ok := t.(*ChanType)
   940  				if !ok {
   941  					break
   942  				}
   943  				dir = c.Dir
   944  				if dir == RecvOnly {
   945  					
   946  					
   947  					p.syntaxError("unexpected <-, expected chan")
   948  					
   949  				}
   950  				c.Dir = RecvOnly
   951  				t = c.Elem
   952  			}
   953  			if dir == SendOnly {
   954  				
   955  				
   956  				p.syntaxError(fmt.Sprintf("unexpected %s, expected chan", String(t)))
   957  				
   958  			}
   959  			return x
   960  		}
   961  
   962  		
   963  		o := new(Operation)
   964  		o.pos = pos
   965  		o.Op = Recv
   966  		o.X = x
   967  		return o
   968  	}
   969  
   970  	
   971  	
   972  	
   973  	return p.pexpr(nil, true)
   974  }
   975  
   976  
   977  func (p *parser) callStmt() *CallStmt {
   978  	if trace {
   979  		defer p.trace("callStmt")()
   980  	}
   981  
   982  	s := new(CallStmt)
   983  	s.pos = p.pos()
   984  	s.Tok = p.tok 
   985  	p.next()
   986  
   987  	x := p.pexpr(nil, p.tok == _Lparen) 
   988  	if t := Unparen(x); t != x {
   989  		p.errorAt(x.Pos(), fmt.Sprintf("expression in %s must not be parenthesized", s.Tok))
   990  		
   991  		x = t
   992  	}
   993  
   994  	s.Call = x
   995  	return s
   996  }
   997  
   998  
   999  
  1000  
  1001  
  1002  func (p *parser) operand(keep_parens bool) Expr {
  1003  	if trace {
  1004  		defer p.trace("operand " + p.tok.String())()
  1005  	}
  1006  
  1007  	switch p.tok {
  1008  	case _Name:
  1009  		return p.name()
  1010  
  1011  	case _Literal:
  1012  		return p.oliteral()
  1013  
  1014  	case _Lparen:
  1015  		pos := p.pos()
  1016  		p.next()
  1017  		p.xnest++
  1018  		x := p.expr()
  1019  		p.xnest--
  1020  		p.want(_Rparen)
  1021  
  1022  		
  1023  		
  1024  		
  1025  		
  1026  		
  1027  		
  1028  		
  1029  		
  1030  		if p.tok == _Lbrace {
  1031  			keep_parens = true
  1032  		}
  1033  
  1034  		
  1035  		
  1036  		
  1037  		if keep_parens {
  1038  			px := new(ParenExpr)
  1039  			px.pos = pos
  1040  			px.X = x
  1041  			x = px
  1042  		}
  1043  		return x
  1044  
  1045  	case _Func:
  1046  		pos := p.pos()
  1047  		p.next()
  1048  		_, ftyp := p.funcType("function type")
  1049  		if p.tok == _Lbrace {
  1050  			p.xnest++
  1051  
  1052  			f := new(FuncLit)
  1053  			f.pos = pos
  1054  			f.Type = ftyp
  1055  			f.Body = p.funcBody()
  1056  
  1057  			p.xnest--
  1058  			return f
  1059  		}
  1060  		return ftyp
  1061  
  1062  	case _Lbrack, _Chan, _Map, _Struct, _Interface:
  1063  		return p.type_() 
  1064  
  1065  	default:
  1066  		x := p.badExpr()
  1067  		p.syntaxError("expected expression")
  1068  		p.advance(_Rparen, _Rbrack, _Rbrace)
  1069  		return x
  1070  	}
  1071  
  1072  	
  1073  	
  1074  	
  1075  	
  1076  }
  1077  
  1078  
  1079  
  1080  
  1081  
  1082  
  1083  
  1084  
  1085  
  1086  
  1087  
  1088  
  1089  
  1090  
  1091  
  1092  
  1093  
  1094  
  1095  
  1096  func (p *parser) pexpr(x Expr, keep_parens bool) Expr {
  1097  	if trace {
  1098  		defer p.trace("pexpr")()
  1099  	}
  1100  
  1101  	if x == nil {
  1102  		x = p.operand(keep_parens)
  1103  	}
  1104  
  1105  loop:
  1106  	for {
  1107  		pos := p.pos()
  1108  		switch p.tok {
  1109  		case _Dot:
  1110  			p.next()
  1111  			switch p.tok {
  1112  			case _Name:
  1113  				
  1114  				t := new(SelectorExpr)
  1115  				t.pos = pos
  1116  				t.X = x
  1117  				t.Sel = p.name()
  1118  				x = t
  1119  
  1120  			case _Lparen:
  1121  				p.next()
  1122  				if p.got(_Type) {
  1123  					t := new(TypeSwitchGuard)
  1124  					
  1125  					t.pos = pos
  1126  					t.X = x
  1127  					x = t
  1128  				} else {
  1129  					t := new(AssertExpr)
  1130  					t.pos = pos
  1131  					t.X = x
  1132  					t.Type = p.type_()
  1133  					x = t
  1134  				}
  1135  				p.want(_Rparen)
  1136  
  1137  			default:
  1138  				p.syntaxError("expected name or (")
  1139  				p.advance(_Semi, _Rparen)
  1140  			}
  1141  
  1142  		case _Lbrack:
  1143  			p.next()
  1144  
  1145  			var i Expr
  1146  			if p.tok != _Colon {
  1147  				var comma bool
  1148  				if p.tok == _Rbrack {
  1149  					
  1150  					p.syntaxError("expected operand")
  1151  					i = p.badExpr()
  1152  				} else {
  1153  					i, comma = p.typeList(false)
  1154  				}
  1155  				if comma || p.tok == _Rbrack {
  1156  					p.want(_Rbrack)
  1157  					
  1158  					t := new(IndexExpr)
  1159  					t.pos = pos
  1160  					t.X = x
  1161  					t.Index = i
  1162  					x = t
  1163  					break
  1164  				}
  1165  			}
  1166  
  1167  			
  1168  			
  1169  			if !p.got(_Colon) {
  1170  				p.syntaxError("expected comma, : or ]")
  1171  				p.advance(_Comma, _Colon, _Rbrack)
  1172  			}
  1173  			p.xnest++
  1174  			t := new(SliceExpr)
  1175  			t.pos = pos
  1176  			t.X = x
  1177  			t.Index[0] = i
  1178  			if p.tok != _Colon && p.tok != _Rbrack {
  1179  				
  1180  				t.Index[1] = p.expr()
  1181  			}
  1182  			if p.tok == _Colon {
  1183  				t.Full = true
  1184  				
  1185  				if t.Index[1] == nil {
  1186  					p.error("middle index required in 3-index slice")
  1187  					t.Index[1] = p.badExpr()
  1188  				}
  1189  				p.next()
  1190  				if p.tok != _Rbrack {
  1191  					
  1192  					t.Index[2] = p.expr()
  1193  				} else {
  1194  					p.error("final index required in 3-index slice")
  1195  					t.Index[2] = p.badExpr()
  1196  				}
  1197  			}
  1198  			p.xnest--
  1199  			p.want(_Rbrack)
  1200  			x = t
  1201  
  1202  		case _Lparen:
  1203  			t := new(CallExpr)
  1204  			t.pos = pos
  1205  			p.next()
  1206  			t.Fun = x
  1207  			t.ArgList, t.HasDots = p.argList()
  1208  			x = t
  1209  
  1210  		case _Lbrace:
  1211  			
  1212  			
  1213  			t := Unparen(x)
  1214  			
  1215  			complit_ok := false
  1216  			switch t.(type) {
  1217  			case *Name, *SelectorExpr:
  1218  				if p.xnest >= 0 {
  1219  					
  1220  					complit_ok = true
  1221  				}
  1222  			case *IndexExpr:
  1223  				if p.xnest >= 0 && !isValue(t) {
  1224  					
  1225  					complit_ok = true
  1226  				}
  1227  			case *ArrayType, *SliceType, *StructType, *MapType:
  1228  				
  1229  				complit_ok = true
  1230  			}
  1231  			if !complit_ok {
  1232  				break loop
  1233  			}
  1234  			if t != x {
  1235  				p.syntaxError("cannot parenthesize type in composite literal")
  1236  				
  1237  			}
  1238  			n := p.complitexpr()
  1239  			n.Type = x
  1240  			x = n
  1241  
  1242  		default:
  1243  			break loop
  1244  		}
  1245  	}
  1246  
  1247  	return x
  1248  }
  1249  
  1250  
  1251  func isValue(x Expr) bool {
  1252  	switch x := x.(type) {
  1253  	case *BasicLit, *CompositeLit, *FuncLit, *SliceExpr, *AssertExpr, *TypeSwitchGuard, *CallExpr:
  1254  		return true
  1255  	case *Operation:
  1256  		return x.Op != Mul || x.Y != nil 
  1257  	case *ParenExpr:
  1258  		return isValue(x.X)
  1259  	case *IndexExpr:
  1260  		return isValue(x.X) || isValue(x.Index)
  1261  	}
  1262  	return false
  1263  }
  1264  
  1265  
  1266  func (p *parser) bare_complitexpr() Expr {
  1267  	if trace {
  1268  		defer p.trace("bare_complitexpr")()
  1269  	}
  1270  
  1271  	if p.tok == _Lbrace {
  1272  		
  1273  		return p.complitexpr()
  1274  	}
  1275  
  1276  	return p.expr()
  1277  }
  1278  
  1279  
  1280  func (p *parser) complitexpr() *CompositeLit {
  1281  	if trace {
  1282  		defer p.trace("complitexpr")()
  1283  	}
  1284  
  1285  	x := new(CompositeLit)
  1286  	x.pos = p.pos()
  1287  
  1288  	p.xnest++
  1289  	p.want(_Lbrace)
  1290  	x.Rbrace = p.list("composite literal", _Comma, _Rbrace, func() bool {
  1291  		
  1292  		e := p.bare_complitexpr()
  1293  		if p.tok == _Colon {
  1294  			
  1295  			l := new(KeyValueExpr)
  1296  			l.pos = p.pos()
  1297  			p.next()
  1298  			l.Key = e
  1299  			l.Value = p.bare_complitexpr()
  1300  			e = l
  1301  			x.NKeys++
  1302  		}
  1303  		x.ElemList = append(x.ElemList, e)
  1304  		return false
  1305  	})
  1306  	p.xnest--
  1307  
  1308  	return x
  1309  }
  1310  
  1311  
  1312  
  1313  
  1314  func (p *parser) type_() Expr {
  1315  	if trace {
  1316  		defer p.trace("type_")()
  1317  	}
  1318  
  1319  	typ := p.typeOrNil()
  1320  	if typ == nil {
  1321  		typ = p.badExpr()
  1322  		p.syntaxError("expected type")
  1323  		p.advance(_Comma, _Colon, _Semi, _Rparen, _Rbrack, _Rbrace)
  1324  	}
  1325  
  1326  	return typ
  1327  }
  1328  
  1329  func newIndirect(pos Pos, typ Expr) Expr {
  1330  	o := new(Operation)
  1331  	o.pos = pos
  1332  	o.Op = Mul
  1333  	o.X = typ
  1334  	return o
  1335  }
  1336  
  1337  
  1338  
  1339  
  1340  
  1341  
  1342  
  1343  
  1344  func (p *parser) typeOrNil() Expr {
  1345  	if trace {
  1346  		defer p.trace("typeOrNil")()
  1347  	}
  1348  
  1349  	pos := p.pos()
  1350  	switch p.tok {
  1351  	case _Star:
  1352  		
  1353  		p.next()
  1354  		return newIndirect(pos, p.type_())
  1355  
  1356  	case _Arrow:
  1357  		
  1358  		p.next()
  1359  		p.want(_Chan)
  1360  		t := new(ChanType)
  1361  		t.pos = pos
  1362  		t.Dir = RecvOnly
  1363  		t.Elem = p.chanElem()
  1364  		return t
  1365  
  1366  	case _Func:
  1367  		
  1368  		p.next()
  1369  		_, t := p.funcType("function type")
  1370  		return t
  1371  
  1372  	case _Lbrack:
  1373  		
  1374  		
  1375  		p.next()
  1376  		if p.got(_Rbrack) {
  1377  			return p.sliceType(pos)
  1378  		}
  1379  		return p.arrayType(pos, nil)
  1380  
  1381  	case _Chan:
  1382  		
  1383  		
  1384  		p.next()
  1385  		t := new(ChanType)
  1386  		t.pos = pos
  1387  		if p.got(_Arrow) {
  1388  			t.Dir = SendOnly
  1389  		}
  1390  		t.Elem = p.chanElem()
  1391  		return t
  1392  
  1393  	case _Map:
  1394  		
  1395  		p.next()
  1396  		p.want(_Lbrack)
  1397  		t := new(MapType)
  1398  		t.pos = pos
  1399  		t.Key = p.type_()
  1400  		p.want(_Rbrack)
  1401  		t.Value = p.type_()
  1402  		return t
  1403  
  1404  	case _Struct:
  1405  		return p.structType()
  1406  
  1407  	case _Interface:
  1408  		return p.interfaceType()
  1409  
  1410  	case _Name:
  1411  		return p.qualifiedName(nil)
  1412  
  1413  	case _Lparen:
  1414  		p.next()
  1415  		t := p.type_()
  1416  		p.want(_Rparen)
  1417  		
  1418  		
  1419  		
  1420  		const keep_parens = false
  1421  		if keep_parens {
  1422  			px := new(ParenExpr)
  1423  			px.pos = pos
  1424  			px.X = t
  1425  			t = px
  1426  		}
  1427  		return t
  1428  	}
  1429  
  1430  	return nil
  1431  }
  1432  
  1433  func (p *parser) typeInstance(typ Expr) Expr {
  1434  	if trace {
  1435  		defer p.trace("typeInstance")()
  1436  	}
  1437  
  1438  	pos := p.pos()
  1439  	p.want(_Lbrack)
  1440  	x := new(IndexExpr)
  1441  	x.pos = pos
  1442  	x.X = typ
  1443  	if p.tok == _Rbrack {
  1444  		p.syntaxError("expected type argument list")
  1445  		x.Index = p.badExpr()
  1446  	} else {
  1447  		x.Index, _ = p.typeList(true)
  1448  	}
  1449  	p.want(_Rbrack)
  1450  	return x
  1451  }
  1452  
  1453  
  1454  func (p *parser) funcType(context string) ([]*Field, *FuncType) {
  1455  	if trace {
  1456  		defer p.trace("funcType")()
  1457  	}
  1458  
  1459  	typ := new(FuncType)
  1460  	typ.pos = p.pos()
  1461  
  1462  	var tparamList []*Field
  1463  	if p.got(_Lbrack) {
  1464  		if context != "" {
  1465  			
  1466  			p.syntaxErrorAt(typ.pos, context+" must have no type parameters")
  1467  		}
  1468  		if p.tok == _Rbrack {
  1469  			p.syntaxError("empty type parameter list")
  1470  			p.next()
  1471  		} else {
  1472  			tparamList = p.paramList(nil, nil, _Rbrack, true, false)
  1473  		}
  1474  	}
  1475  
  1476  	p.want(_Lparen)
  1477  	typ.ParamList = p.paramList(nil, nil, _Rparen, false, true)
  1478  	typ.ResultList = p.funcResult()
  1479  
  1480  	return tparamList, typ
  1481  }
  1482  
  1483  
  1484  
  1485  func (p *parser) arrayType(pos Pos, len Expr) Expr {
  1486  	if trace {
  1487  		defer p.trace("arrayType")()
  1488  	}
  1489  
  1490  	if len == nil && !p.got(_DotDotDot) {
  1491  		p.xnest++
  1492  		len = p.expr()
  1493  		p.xnest--
  1494  	}
  1495  	if p.tok == _Comma {
  1496  		
  1497  		
  1498  		
  1499  		p.syntaxError("unexpected comma; expected ]")
  1500  		p.next()
  1501  	}
  1502  	p.want(_Rbrack)
  1503  	t := new(ArrayType)
  1504  	t.pos = pos
  1505  	t.Len = len
  1506  	t.Elem = p.type_()
  1507  	return t
  1508  }
  1509  
  1510  
  1511  func (p *parser) sliceType(pos Pos) Expr {
  1512  	t := new(SliceType)
  1513  	t.pos = pos
  1514  	t.Elem = p.type_()
  1515  	return t
  1516  }
  1517  
  1518  func (p *parser) chanElem() Expr {
  1519  	if trace {
  1520  		defer p.trace("chanElem")()
  1521  	}
  1522  
  1523  	typ := p.typeOrNil()
  1524  	if typ == nil {
  1525  		typ = p.badExpr()
  1526  		p.syntaxError("missing channel element type")
  1527  		
  1528  	}
  1529  
  1530  	return typ
  1531  }
  1532  
  1533  
  1534  func (p *parser) structType() *StructType {
  1535  	if trace {
  1536  		defer p.trace("structType")()
  1537  	}
  1538  
  1539  	typ := new(StructType)
  1540  	typ.pos = p.pos()
  1541  
  1542  	p.want(_Struct)
  1543  	p.want(_Lbrace)
  1544  	p.list("struct type", _Semi, _Rbrace, func() bool {
  1545  		p.fieldDecl(typ)
  1546  		return false
  1547  	})
  1548  
  1549  	return typ
  1550  }
  1551  
  1552  
  1553  func (p *parser) interfaceType() *InterfaceType {
  1554  	if trace {
  1555  		defer p.trace("interfaceType")()
  1556  	}
  1557  
  1558  	typ := new(InterfaceType)
  1559  	typ.pos = p.pos()
  1560  
  1561  	p.want(_Interface)
  1562  	p.want(_Lbrace)
  1563  	p.list("interface type", _Semi, _Rbrace, func() bool {
  1564  		var f *Field
  1565  		if p.tok == _Name {
  1566  			f = p.methodDecl()
  1567  		}
  1568  		if f == nil || f.Name == nil {
  1569  			f = p.embeddedElem(f)
  1570  		}
  1571  		typ.MethodList = append(typ.MethodList, f)
  1572  		return false
  1573  	})
  1574  
  1575  	return typ
  1576  }
  1577  
  1578  
  1579  func (p *parser) funcResult() []*Field {
  1580  	if trace {
  1581  		defer p.trace("funcResult")()
  1582  	}
  1583  
  1584  	if p.got(_Lparen) {
  1585  		return p.paramList(nil, nil, _Rparen, false, false)
  1586  	}
  1587  
  1588  	pos := p.pos()
  1589  	if typ := p.typeOrNil(); typ != nil {
  1590  		f := new(Field)
  1591  		f.pos = pos
  1592  		f.Type = typ
  1593  		return []*Field{f}
  1594  	}
  1595  
  1596  	return nil
  1597  }
  1598  
  1599  func (p *parser) addField(styp *StructType, pos Pos, name *Name, typ Expr, tag *BasicLit) {
  1600  	if tag != nil {
  1601  		for i := len(styp.FieldList) - len(styp.TagList); i > 0; i-- {
  1602  			styp.TagList = append(styp.TagList, nil)
  1603  		}
  1604  		styp.TagList = append(styp.TagList, tag)
  1605  	}
  1606  
  1607  	f := new(Field)
  1608  	f.pos = pos
  1609  	f.Name = name
  1610  	f.Type = typ
  1611  	styp.FieldList = append(styp.FieldList, f)
  1612  
  1613  	if debug && tag != nil && len(styp.FieldList) != len(styp.TagList) {
  1614  		panic("inconsistent struct field list")
  1615  	}
  1616  }
  1617  
  1618  
  1619  
  1620  
  1621  func (p *parser) fieldDecl(styp *StructType) {
  1622  	if trace {
  1623  		defer p.trace("fieldDecl")()
  1624  	}
  1625  
  1626  	pos := p.pos()
  1627  	switch p.tok {
  1628  	case _Name:
  1629  		name := p.name()
  1630  		if p.tok == _Dot || p.tok == _Literal || p.tok == _Semi || p.tok == _Rbrace {
  1631  			
  1632  			typ := p.qualifiedName(name)
  1633  			tag := p.oliteral()
  1634  			p.addField(styp, pos, nil, typ, tag)
  1635  			break
  1636  		}
  1637  
  1638  		
  1639  		names := p.nameList(name)
  1640  		var typ Expr
  1641  
  1642  		
  1643  		
  1644  		if len(names) == 1 && p.tok == _Lbrack {
  1645  			typ = p.arrayOrTArgs()
  1646  			if typ, ok := typ.(*IndexExpr); ok {
  1647  				
  1648  				typ.X = name 
  1649  				tag := p.oliteral()
  1650  				p.addField(styp, pos, nil, typ, tag)
  1651  				break
  1652  			}
  1653  		} else {
  1654  			
  1655  			typ = p.type_()
  1656  		}
  1657  
  1658  		tag := p.oliteral()
  1659  
  1660  		for _, name := range names {
  1661  			p.addField(styp, name.Pos(), name, typ, tag)
  1662  		}
  1663  
  1664  	case _Star:
  1665  		p.next()
  1666  		var typ Expr
  1667  		if p.tok == _Lparen {
  1668  			
  1669  			p.syntaxError("cannot parenthesize embedded type")
  1670  			p.next()
  1671  			typ = p.qualifiedName(nil)
  1672  			p.got(_Rparen) 
  1673  		} else {
  1674  			
  1675  			typ = p.qualifiedName(nil)
  1676  		}
  1677  		tag := p.oliteral()
  1678  		p.addField(styp, pos, nil, newIndirect(pos, typ), tag)
  1679  
  1680  	case _Lparen:
  1681  		p.syntaxError("cannot parenthesize embedded type")
  1682  		p.next()
  1683  		var typ Expr
  1684  		if p.tok == _Star {
  1685  			
  1686  			pos := p.pos()
  1687  			p.next()
  1688  			typ = newIndirect(pos, p.qualifiedName(nil))
  1689  		} else {
  1690  			
  1691  			typ = p.qualifiedName(nil)
  1692  		}
  1693  		p.got(_Rparen) 
  1694  		tag := p.oliteral()
  1695  		p.addField(styp, pos, nil, typ, tag)
  1696  
  1697  	default:
  1698  		p.syntaxError("expected field name or embedded type")
  1699  		p.advance(_Semi, _Rbrace)
  1700  	}
  1701  }
  1702  
  1703  func (p *parser) arrayOrTArgs() Expr {
  1704  	if trace {
  1705  		defer p.trace("arrayOrTArgs")()
  1706  	}
  1707  
  1708  	pos := p.pos()
  1709  	p.want(_Lbrack)
  1710  	if p.got(_Rbrack) {
  1711  		return p.sliceType(pos)
  1712  	}
  1713  
  1714  	
  1715  	n, comma := p.typeList(false)
  1716  	p.want(_Rbrack)
  1717  	if !comma {
  1718  		if elem := p.typeOrNil(); elem != nil {
  1719  			
  1720  			t := new(ArrayType)
  1721  			t.pos = pos
  1722  			t.Len = n
  1723  			t.Elem = elem
  1724  			return t
  1725  		}
  1726  	}
  1727  
  1728  	
  1729  	t := new(IndexExpr)
  1730  	t.pos = pos
  1731  	
  1732  	t.Index = n
  1733  	return t
  1734  }
  1735  
  1736  func (p *parser) oliteral() *BasicLit {
  1737  	if p.tok == _Literal {
  1738  		b := new(BasicLit)
  1739  		b.pos = p.pos()
  1740  		b.Value = p.lit
  1741  		b.Kind = p.kind
  1742  		b.Bad = p.bad
  1743  		p.next()
  1744  		return b
  1745  	}
  1746  	return nil
  1747  }
  1748  
  1749  
  1750  
  1751  
  1752  func (p *parser) methodDecl() *Field {
  1753  	if trace {
  1754  		defer p.trace("methodDecl")()
  1755  	}
  1756  
  1757  	f := new(Field)
  1758  	f.pos = p.pos()
  1759  	name := p.name()
  1760  
  1761  	const context = "interface method"
  1762  
  1763  	switch p.tok {
  1764  	case _Lparen:
  1765  		
  1766  		f.Name = name
  1767  		_, f.Type = p.funcType(context)
  1768  
  1769  	case _Lbrack:
  1770  		
  1771  		
  1772  		
  1773  		pos := p.pos()
  1774  		p.next()
  1775  
  1776  		
  1777  		
  1778  		if p.tok == _Rbrack {
  1779  			
  1780  			pos := p.pos()
  1781  			p.next()
  1782  			if p.tok == _Lparen {
  1783  				
  1784  				p.errorAt(pos, "empty type parameter list")
  1785  				f.Name = name
  1786  				_, f.Type = p.funcType(context)
  1787  			} else {
  1788  				p.errorAt(pos, "empty type argument list")
  1789  				f.Type = name
  1790  			}
  1791  			break
  1792  		}
  1793  
  1794  		
  1795  		
  1796  		list := p.paramList(nil, nil, _Rbrack, false, false)
  1797  		if len(list) == 0 {
  1798  			
  1799  			
  1800  			
  1801  			if p.tok == _Lparen {
  1802  				f.Name = name
  1803  				_, f.Type = p.funcType(context)
  1804  			} else {
  1805  				f.Type = name
  1806  			}
  1807  			break
  1808  		}
  1809  
  1810  		
  1811  		if list[0].Name != nil {
  1812  			
  1813  			f.Name = name
  1814  			_, f.Type = p.funcType(context)
  1815  			p.errorAt(pos, "interface method must have no type parameters")
  1816  			break
  1817  		}
  1818  
  1819  		
  1820  		t := new(IndexExpr)
  1821  		t.pos = pos
  1822  		t.X = name
  1823  		if len(list) == 1 {
  1824  			t.Index = list[0].Type
  1825  		} else {
  1826  			
  1827  			l := new(ListExpr)
  1828  			l.pos = list[0].Pos()
  1829  			l.ElemList = make([]Expr, len(list))
  1830  			for i := range list {
  1831  				l.ElemList[i] = list[i].Type
  1832  			}
  1833  			t.Index = l
  1834  		}
  1835  		f.Type = t
  1836  
  1837  	default:
  1838  		
  1839  		f.Type = p.qualifiedName(name)
  1840  	}
  1841  
  1842  	return f
  1843  }
  1844  
  1845  
  1846  func (p *parser) embeddedElem(f *Field) *Field {
  1847  	if trace {
  1848  		defer p.trace("embeddedElem")()
  1849  	}
  1850  
  1851  	if f == nil {
  1852  		f = new(Field)
  1853  		f.pos = p.pos()
  1854  		f.Type = p.embeddedTerm()
  1855  	}
  1856  
  1857  	for p.tok == _Operator && p.op == Or {
  1858  		t := new(Operation)
  1859  		t.pos = p.pos()
  1860  		t.Op = Or
  1861  		p.next()
  1862  		t.X = f.Type
  1863  		t.Y = p.embeddedTerm()
  1864  		f.Type = t
  1865  	}
  1866  
  1867  	return f
  1868  }
  1869  
  1870  
  1871  func (p *parser) embeddedTerm() Expr {
  1872  	if trace {
  1873  		defer p.trace("embeddedTerm")()
  1874  	}
  1875  
  1876  	if p.tok == _Operator && p.op == Tilde {
  1877  		t := new(Operation)
  1878  		t.pos = p.pos()
  1879  		t.Op = Tilde
  1880  		p.next()
  1881  		t.X = p.type_()
  1882  		return t
  1883  	}
  1884  
  1885  	t := p.typeOrNil()
  1886  	if t == nil {
  1887  		t = p.badExpr()
  1888  		p.syntaxError("expected ~ term or type")
  1889  		p.advance(_Operator, _Semi, _Rparen, _Rbrack, _Rbrace)
  1890  	}
  1891  
  1892  	return t
  1893  }
  1894  
  1895  
  1896  func (p *parser) paramDeclOrNil(name *Name, follow token) *Field {
  1897  	if trace {
  1898  		defer p.trace("paramDeclOrNil")()
  1899  	}
  1900  
  1901  	
  1902  	typeSetsOk := follow == _Rbrack
  1903  
  1904  	pos := p.pos()
  1905  	if name != nil {
  1906  		pos = name.pos
  1907  	} else if typeSetsOk && p.tok == _Operator && p.op == Tilde {
  1908  		
  1909  		return p.embeddedElem(nil)
  1910  	}
  1911  
  1912  	f := new(Field)
  1913  	f.pos = pos
  1914  
  1915  	if p.tok == _Name || name != nil {
  1916  		
  1917  		if name == nil {
  1918  			name = p.name()
  1919  		}
  1920  
  1921  		if p.tok == _Lbrack {
  1922  			
  1923  			f.Type = p.arrayOrTArgs()
  1924  			if typ, ok := f.Type.(*IndexExpr); ok {
  1925  				
  1926  				typ.X = name
  1927  			} else {
  1928  				
  1929  				f.Name = name
  1930  			}
  1931  			if typeSetsOk && p.tok == _Operator && p.op == Or {
  1932  				
  1933  				
  1934  				f = p.embeddedElem(f)
  1935  			}
  1936  			return f
  1937  		}
  1938  
  1939  		if p.tok == _Dot {
  1940  			
  1941  			f.Type = p.qualifiedName(name)
  1942  			if typeSetsOk && p.tok == _Operator && p.op == Or {
  1943  				
  1944  				f = p.embeddedElem(f)
  1945  			}
  1946  			return f
  1947  		}
  1948  
  1949  		if typeSetsOk && p.tok == _Operator && p.op == Or {
  1950  			
  1951  			f.Type = name
  1952  			return p.embeddedElem(f)
  1953  		}
  1954  
  1955  		f.Name = name
  1956  	}
  1957  
  1958  	if p.tok == _DotDotDot {
  1959  		
  1960  		t := new(DotsType)
  1961  		t.pos = p.pos()
  1962  		p.next()
  1963  		t.Elem = p.typeOrNil()
  1964  		if t.Elem == nil {
  1965  			f.Type = p.badExpr()
  1966  			p.syntaxError("... is missing type")
  1967  		} else {
  1968  			f.Type = t
  1969  		}
  1970  		return f
  1971  	}
  1972  
  1973  	if typeSetsOk && p.tok == _Operator && p.op == Tilde {
  1974  		
  1975  		f.Type = p.embeddedElem(nil).Type
  1976  		return f
  1977  	}
  1978  
  1979  	f.Type = p.typeOrNil()
  1980  	if typeSetsOk && p.tok == _Operator && p.op == Or && f.Type != nil {
  1981  		
  1982  		f = p.embeddedElem(f)
  1983  	}
  1984  	if f.Name != nil || f.Type != nil {
  1985  		return f
  1986  	}
  1987  
  1988  	p.syntaxError("expected " + tokstring(follow))
  1989  	p.advance(_Comma, follow)
  1990  	return nil
  1991  }
  1992  
  1993  
  1994  
  1995  
  1996  
  1997  
  1998  
  1999  func (p *parser) paramList(name *Name, typ Expr, close token, requireNames, dddok bool) (list []*Field) {
  2000  	if trace {
  2001  		defer p.trace("paramList")()
  2002  	}
  2003  
  2004  	
  2005  	
  2006  	if name != nil && typ != nil && p.tok == close {
  2007  		p.next()
  2008  		par := new(Field)
  2009  		par.pos = name.pos
  2010  		par.Name = name
  2011  		par.Type = typ
  2012  		return []*Field{par}
  2013  	}
  2014  
  2015  	var named int 
  2016  	var typed int 
  2017  	end := p.list("parameter list", _Comma, close, func() bool {
  2018  		var par *Field
  2019  		if typ != nil {
  2020  			if debug && name == nil {
  2021  				panic("initial type provided without name")
  2022  			}
  2023  			par = new(Field)
  2024  			par.pos = name.pos
  2025  			par.Name = name
  2026  			par.Type = typ
  2027  		} else {
  2028  			par = p.paramDeclOrNil(name, close)
  2029  		}
  2030  		name = nil 
  2031  		typ = nil  
  2032  		if par != nil {
  2033  			if debug && par.Name == nil && par.Type == nil {
  2034  				panic("parameter without name or type")
  2035  			}
  2036  			if par.Name != nil && par.Type != nil {
  2037  				named++
  2038  			}
  2039  			if par.Type != nil {
  2040  				typed++
  2041  			}
  2042  			list = append(list, par)
  2043  		}
  2044  		return false
  2045  	})
  2046  
  2047  	if len(list) == 0 {
  2048  		return
  2049  	}
  2050  
  2051  	
  2052  	if named == 0 && !requireNames {
  2053  		
  2054  		for _, par := range list {
  2055  			if typ := par.Name; typ != nil {
  2056  				par.Type = typ
  2057  				par.Name = nil
  2058  			}
  2059  		}
  2060  	} else if named != len(list) {
  2061  		
  2062  		var errPos Pos 
  2063  		var typ Expr   
  2064  		for i := len(list) - 1; i >= 0; i-- {
  2065  			par := list[i]
  2066  			if par.Type != nil {
  2067  				typ = par.Type
  2068  				if par.Name == nil {
  2069  					errPos = StartPos(typ)
  2070  					par.Name = NewName(errPos, "_")
  2071  				}
  2072  			} else if typ != nil {
  2073  				par.Type = typ
  2074  			} else {
  2075  				
  2076  				errPos = par.Name.Pos()
  2077  				t := p.badExpr()
  2078  				t.pos = errPos 
  2079  				par.Type = t
  2080  			}
  2081  		}
  2082  		if errPos.IsKnown() {
  2083  			
  2084  			
  2085  			
  2086  			
  2087  			
  2088  			
  2089  			
  2090  			var msg string
  2091  			if named == typed {
  2092  				errPos = end 
  2093  				if requireNames {
  2094  					msg = "missing type constraint"
  2095  				} else {
  2096  					msg = "missing parameter type"
  2097  				}
  2098  			} else {
  2099  				if requireNames {
  2100  					msg = "missing type parameter name"
  2101  					
  2102  					if len(list) == 1 {
  2103  						msg += " or invalid array length"
  2104  					}
  2105  				} else {
  2106  					msg = "missing parameter name"
  2107  				}
  2108  			}
  2109  			p.syntaxErrorAt(errPos, msg)
  2110  		}
  2111  	}
  2112  
  2113  	
  2114  	first := true 
  2115  	for i, f := range list {
  2116  		if t, _ := f.Type.(*DotsType); t != nil && (!dddok || i+1 < len(list)) {
  2117  			if first {
  2118  				first = false
  2119  				if dddok {
  2120  					p.errorAt(t.pos, "can only use ... with final parameter")
  2121  				} else {
  2122  					p.errorAt(t.pos, "invalid use of ...")
  2123  				}
  2124  			}
  2125  			
  2126  			f.Type = t.Elem
  2127  		}
  2128  	}
  2129  
  2130  	return
  2131  }
  2132  
  2133  func (p *parser) badExpr() *BadExpr {
  2134  	b := new(BadExpr)
  2135  	b.pos = p.pos()
  2136  	return b
  2137  }
  2138  
  2139  
  2140  
  2141  
  2142  
  2143  func (p *parser) simpleStmt(lhs Expr, keyword token) SimpleStmt {
  2144  	if trace {
  2145  		defer p.trace("simpleStmt")()
  2146  	}
  2147  
  2148  	if keyword == _For && p.tok == _Range {
  2149  		
  2150  		if debug && lhs != nil {
  2151  			panic("invalid call of simpleStmt")
  2152  		}
  2153  		return p.newRangeClause(nil, false)
  2154  	}
  2155  
  2156  	if lhs == nil {
  2157  		lhs = p.exprList()
  2158  	}
  2159  
  2160  	if _, ok := lhs.(*ListExpr); !ok && p.tok != _Assign && p.tok != _Define {
  2161  		
  2162  		pos := p.pos()
  2163  		switch p.tok {
  2164  		case _AssignOp:
  2165  			
  2166  			op := p.op
  2167  			p.next()
  2168  			return p.newAssignStmt(pos, op, lhs, p.expr())
  2169  
  2170  		case _IncOp:
  2171  			
  2172  			op := p.op
  2173  			p.next()
  2174  			return p.newAssignStmt(pos, op, lhs, nil)
  2175  
  2176  		case _Arrow:
  2177  			
  2178  			s := new(SendStmt)
  2179  			s.pos = pos
  2180  			p.next()
  2181  			s.Chan = lhs
  2182  			s.Value = p.expr()
  2183  			return s
  2184  
  2185  		default:
  2186  			
  2187  			s := new(ExprStmt)
  2188  			s.pos = lhs.Pos()
  2189  			s.X = lhs
  2190  			return s
  2191  		}
  2192  	}
  2193  
  2194  	
  2195  	switch p.tok {
  2196  	case _Assign, _Define:
  2197  		pos := p.pos()
  2198  		var op Operator
  2199  		if p.tok == _Define {
  2200  			op = Def
  2201  		}
  2202  		p.next()
  2203  
  2204  		if keyword == _For && p.tok == _Range {
  2205  			
  2206  			return p.newRangeClause(lhs, op == Def)
  2207  		}
  2208  
  2209  		
  2210  		rhs := p.exprList()
  2211  
  2212  		if x, ok := rhs.(*TypeSwitchGuard); ok && keyword == _Switch && op == Def {
  2213  			if lhs, ok := lhs.(*Name); ok {
  2214  				
  2215  				x.Lhs = lhs
  2216  				s := new(ExprStmt)
  2217  				s.pos = x.Pos()
  2218  				s.X = x
  2219  				return s
  2220  			}
  2221  		}
  2222  
  2223  		return p.newAssignStmt(pos, op, lhs, rhs)
  2224  
  2225  	default:
  2226  		p.syntaxError("expected := or = or comma")
  2227  		p.advance(_Semi, _Rbrace)
  2228  		
  2229  		if x, ok := lhs.(*ListExpr); ok {
  2230  			lhs = x.ElemList[0]
  2231  		}
  2232  		s := new(ExprStmt)
  2233  		s.pos = lhs.Pos()
  2234  		s.X = lhs
  2235  		return s
  2236  	}
  2237  }
  2238  
  2239  func (p *parser) newRangeClause(lhs Expr, def bool) *RangeClause {
  2240  	r := new(RangeClause)
  2241  	r.pos = p.pos()
  2242  	p.next() 
  2243  	r.Lhs = lhs
  2244  	r.Def = def
  2245  	r.X = p.expr()
  2246  	return r
  2247  }
  2248  
  2249  func (p *parser) newAssignStmt(pos Pos, op Operator, lhs, rhs Expr) *AssignStmt {
  2250  	a := new(AssignStmt)
  2251  	a.pos = pos
  2252  	a.Op = op
  2253  	a.Lhs = lhs
  2254  	a.Rhs = rhs
  2255  	return a
  2256  }
  2257  
  2258  func (p *parser) labeledStmtOrNil(label *Name) Stmt {
  2259  	if trace {
  2260  		defer p.trace("labeledStmt")()
  2261  	}
  2262  
  2263  	s := new(LabeledStmt)
  2264  	s.pos = p.pos()
  2265  	s.Label = label
  2266  
  2267  	p.want(_Colon)
  2268  
  2269  	if p.tok == _Rbrace {
  2270  		
  2271  		
  2272  		
  2273  		e := new(EmptyStmt)
  2274  		e.pos = p.pos()
  2275  		s.Stmt = e
  2276  		return s
  2277  	}
  2278  
  2279  	s.Stmt = p.stmtOrNil()
  2280  	if s.Stmt != nil {
  2281  		return s
  2282  	}
  2283  
  2284  	
  2285  	p.syntaxErrorAt(s.pos, "missing statement after label")
  2286  	
  2287  	return nil 
  2288  }
  2289  
  2290  
  2291  func (p *parser) blockStmt(context string) *BlockStmt {
  2292  	if trace {
  2293  		defer p.trace("blockStmt")()
  2294  	}
  2295  
  2296  	s := new(BlockStmt)
  2297  	s.pos = p.pos()
  2298  
  2299  	
  2300  	if !p.got(_Lbrace) {
  2301  		p.syntaxError("expected { after " + context)
  2302  		p.advance(_Name, _Rbrace)
  2303  		s.Rbrace = p.pos() 
  2304  		if p.got(_Rbrace) {
  2305  			return s
  2306  		}
  2307  	}
  2308  
  2309  	s.List = p.stmtList()
  2310  	s.Rbrace = p.pos()
  2311  	p.want(_Rbrace)
  2312  
  2313  	return s
  2314  }
  2315  
  2316  func (p *parser) declStmt(f func(*Group) Decl) *DeclStmt {
  2317  	if trace {
  2318  		defer p.trace("declStmt")()
  2319  	}
  2320  
  2321  	s := new(DeclStmt)
  2322  	s.pos = p.pos()
  2323  
  2324  	p.next() 
  2325  	s.DeclList = p.appendGroup(nil, f)
  2326  
  2327  	return s
  2328  }
  2329  
  2330  func (p *parser) forStmt() Stmt {
  2331  	if trace {
  2332  		defer p.trace("forStmt")()
  2333  	}
  2334  
  2335  	s := new(ForStmt)
  2336  	s.pos = p.pos()
  2337  
  2338  	s.Init, s.Cond, s.Post = p.header(_For)
  2339  	s.Body = p.blockStmt("for clause")
  2340  
  2341  	return s
  2342  }
  2343  
  2344  func (p *parser) header(keyword token) (init SimpleStmt, cond Expr, post SimpleStmt) {
  2345  	p.want(keyword)
  2346  
  2347  	if p.tok == _Lbrace {
  2348  		if keyword == _If {
  2349  			p.syntaxError("missing condition in if statement")
  2350  			cond = p.badExpr()
  2351  		}
  2352  		return
  2353  	}
  2354  	
  2355  
  2356  	outer := p.xnest
  2357  	p.xnest = -1
  2358  
  2359  	if p.tok != _Semi {
  2360  		
  2361  		if p.got(_Var) {
  2362  			p.syntaxError(fmt.Sprintf("var declaration not allowed in %s initializer", keyword.String()))
  2363  		}
  2364  		init = p.simpleStmt(nil, keyword)
  2365  		
  2366  		if _, ok := init.(*RangeClause); ok {
  2367  			p.xnest = outer
  2368  			return
  2369  		}
  2370  	}
  2371  
  2372  	var condStmt SimpleStmt
  2373  	var semi struct {
  2374  		pos Pos
  2375  		lit string 
  2376  	}
  2377  	if p.tok != _Lbrace {
  2378  		if p.tok == _Semi {
  2379  			semi.pos = p.pos()
  2380  			semi.lit = p.lit
  2381  			p.next()
  2382  		} else {
  2383  			
  2384  			p.want(_Lbrace)
  2385  			if p.tok != _Lbrace {
  2386  				p.advance(_Lbrace, _Rbrace) 
  2387  			}
  2388  		}
  2389  		if keyword == _For {
  2390  			if p.tok != _Semi {
  2391  				if p.tok == _Lbrace {
  2392  					p.syntaxError("expected for loop condition")
  2393  					goto done
  2394  				}
  2395  				condStmt = p.simpleStmt(nil, 0 )
  2396  			}
  2397  			p.want(_Semi)
  2398  			if p.tok != _Lbrace {
  2399  				post = p.simpleStmt(nil, 0 )
  2400  				if a, _ := post.(*AssignStmt); a != nil && a.Op == Def {
  2401  					p.syntaxErrorAt(a.Pos(), "cannot declare in post statement of for loop")
  2402  				}
  2403  			}
  2404  		} else if p.tok != _Lbrace {
  2405  			condStmt = p.simpleStmt(nil, keyword)
  2406  		}
  2407  	} else {
  2408  		condStmt = init
  2409  		init = nil
  2410  	}
  2411  
  2412  done:
  2413  	
  2414  	switch s := condStmt.(type) {
  2415  	case nil:
  2416  		if keyword == _If && semi.pos.IsKnown() {
  2417  			if semi.lit != "semicolon" {
  2418  				p.syntaxErrorAt(semi.pos, fmt.Sprintf("unexpected %s, expected { after if clause", semi.lit))
  2419  			} else {
  2420  				p.syntaxErrorAt(semi.pos, "missing condition in if statement")
  2421  			}
  2422  			b := new(BadExpr)
  2423  			b.pos = semi.pos
  2424  			cond = b
  2425  		}
  2426  	case *ExprStmt:
  2427  		cond = s.X
  2428  	default:
  2429  		
  2430  		
  2431  		
  2432  		
  2433  		var str string
  2434  		if as, ok := s.(*AssignStmt); ok && as.Op == 0 {
  2435  			
  2436  			str = "assignment " + emphasize(as.Lhs) + " = " + emphasize(as.Rhs)
  2437  		} else {
  2438  			str = String(s)
  2439  		}
  2440  		p.syntaxErrorAt(s.Pos(), fmt.Sprintf("cannot use %s as value", str))
  2441  	}
  2442  
  2443  	p.xnest = outer
  2444  	return
  2445  }
  2446  
  2447  
  2448  
  2449  func emphasize(x Expr) string {
  2450  	s := String(x)
  2451  	if op, _ := x.(*Operation); op != nil && op.Y != nil {
  2452  		
  2453  		return "(" + s + ")"
  2454  	}
  2455  	return s
  2456  }
  2457  
  2458  func (p *parser) ifStmt() *IfStmt {
  2459  	if trace {
  2460  		defer p.trace("ifStmt")()
  2461  	}
  2462  
  2463  	s := new(IfStmt)
  2464  	s.pos = p.pos()
  2465  
  2466  	s.Init, s.Cond, _ = p.header(_If)
  2467  	s.Then = p.blockStmt("if clause")
  2468  
  2469  	if p.got(_Else) {
  2470  		switch p.tok {
  2471  		case _If:
  2472  			s.Else = p.ifStmt()
  2473  		case _Lbrace:
  2474  			s.Else = p.blockStmt("")
  2475  		default:
  2476  			p.syntaxError("else must be followed by if or statement block")
  2477  			p.advance(_Name, _Rbrace)
  2478  		}
  2479  	}
  2480  
  2481  	return s
  2482  }
  2483  
  2484  func (p *parser) switchStmt() *SwitchStmt {
  2485  	if trace {
  2486  		defer p.trace("switchStmt")()
  2487  	}
  2488  
  2489  	s := new(SwitchStmt)
  2490  	s.pos = p.pos()
  2491  
  2492  	s.Init, s.Tag, _ = p.header(_Switch)
  2493  
  2494  	if !p.got(_Lbrace) {
  2495  		p.syntaxError("missing { after switch clause")
  2496  		p.advance(_Case, _Default, _Rbrace)
  2497  	}
  2498  	for p.tok != _EOF && p.tok != _Rbrace {
  2499  		s.Body = append(s.Body, p.caseClause())
  2500  	}
  2501  	s.Rbrace = p.pos()
  2502  	p.want(_Rbrace)
  2503  
  2504  	return s
  2505  }
  2506  
  2507  func (p *parser) selectStmt() *SelectStmt {
  2508  	if trace {
  2509  		defer p.trace("selectStmt")()
  2510  	}
  2511  
  2512  	s := new(SelectStmt)
  2513  	s.pos = p.pos()
  2514  
  2515  	p.want(_Select)
  2516  	if !p.got(_Lbrace) {
  2517  		p.syntaxError("missing { after select clause")
  2518  		p.advance(_Case, _Default, _Rbrace)
  2519  	}
  2520  	for p.tok != _EOF && p.tok != _Rbrace {
  2521  		s.Body = append(s.Body, p.commClause())
  2522  	}
  2523  	s.Rbrace = p.pos()
  2524  	p.want(_Rbrace)
  2525  
  2526  	return s
  2527  }
  2528  
  2529  func (p *parser) caseClause() *CaseClause {
  2530  	if trace {
  2531  		defer p.trace("caseClause")()
  2532  	}
  2533  
  2534  	c := new(CaseClause)
  2535  	c.pos = p.pos()
  2536  
  2537  	switch p.tok {
  2538  	case _Case:
  2539  		p.next()
  2540  		c.Cases = p.exprList()
  2541  
  2542  	case _Default:
  2543  		p.next()
  2544  
  2545  	default:
  2546  		p.syntaxError("expected case or default or }")
  2547  		p.advance(_Colon, _Case, _Default, _Rbrace)
  2548  	}
  2549  
  2550  	c.Colon = p.pos()
  2551  	p.want(_Colon)
  2552  	c.Body = p.stmtList()
  2553  
  2554  	return c
  2555  }
  2556  
  2557  func (p *parser) commClause() *CommClause {
  2558  	if trace {
  2559  		defer p.trace("commClause")()
  2560  	}
  2561  
  2562  	c := new(CommClause)
  2563  	c.pos = p.pos()
  2564  
  2565  	switch p.tok {
  2566  	case _Case:
  2567  		p.next()
  2568  		c.Comm = p.simpleStmt(nil, 0)
  2569  
  2570  		
  2571  		
  2572  		
  2573  		
  2574  		
  2575  		
  2576  		
  2577  		
  2578  		
  2579  
  2580  	case _Default:
  2581  		p.next()
  2582  
  2583  	default:
  2584  		p.syntaxError("expected case or default or }")
  2585  		p.advance(_Colon, _Case, _Default, _Rbrace)
  2586  	}
  2587  
  2588  	c.Colon = p.pos()
  2589  	p.want(_Colon)
  2590  	c.Body = p.stmtList()
  2591  
  2592  	return c
  2593  }
  2594  
  2595  
  2596  
  2597  
  2598  
  2599  
  2600  
  2601  
  2602  func (p *parser) stmtOrNil() Stmt {
  2603  	if trace {
  2604  		defer p.trace("stmt " + p.tok.String())()
  2605  	}
  2606  
  2607  	
  2608  	
  2609  	if p.tok == _Name {
  2610  		p.clearPragma()
  2611  		lhs := p.exprList()
  2612  		if label, ok := lhs.(*Name); ok && p.tok == _Colon {
  2613  			return p.labeledStmtOrNil(label)
  2614  		}
  2615  		return p.simpleStmt(lhs, 0)
  2616  	}
  2617  
  2618  	switch p.tok {
  2619  	case _Var:
  2620  		return p.declStmt(p.varDecl)
  2621  
  2622  	case _Const:
  2623  		return p.declStmt(p.constDecl)
  2624  
  2625  	case _Type:
  2626  		return p.declStmt(p.typeDecl)
  2627  	}
  2628  
  2629  	p.clearPragma()
  2630  
  2631  	switch p.tok {
  2632  	case _Lbrace:
  2633  		return p.blockStmt("")
  2634  
  2635  	case _Operator, _Star:
  2636  		switch p.op {
  2637  		case Add, Sub, Mul, And, Xor, Not:
  2638  			return p.simpleStmt(nil, 0) 
  2639  		}
  2640  
  2641  	case _Literal, _Func, _Lparen, 
  2642  		_Lbrack, _Struct, _Map, _Chan, _Interface, 
  2643  		_Arrow: 
  2644  		return p.simpleStmt(nil, 0)
  2645  
  2646  	case _For:
  2647  		return p.forStmt()
  2648  
  2649  	case _Switch:
  2650  		return p.switchStmt()
  2651  
  2652  	case _Select:
  2653  		return p.selectStmt()
  2654  
  2655  	case _If:
  2656  		return p.ifStmt()
  2657  
  2658  	case _Fallthrough:
  2659  		s := new(BranchStmt)
  2660  		s.pos = p.pos()
  2661  		p.next()
  2662  		s.Tok = _Fallthrough
  2663  		return s
  2664  
  2665  	case _Break, _Continue:
  2666  		s := new(BranchStmt)
  2667  		s.pos = p.pos()
  2668  		s.Tok = p.tok
  2669  		p.next()
  2670  		if p.tok == _Name {
  2671  			s.Label = p.name()
  2672  		}
  2673  		return s
  2674  
  2675  	case _Go, _Defer:
  2676  		return p.callStmt()
  2677  
  2678  	case _Goto:
  2679  		s := new(BranchStmt)
  2680  		s.pos = p.pos()
  2681  		s.Tok = _Goto
  2682  		p.next()
  2683  		s.Label = p.name()
  2684  		return s
  2685  
  2686  	case _Return:
  2687  		s := new(ReturnStmt)
  2688  		s.pos = p.pos()
  2689  		p.next()
  2690  		if p.tok != _Semi && p.tok != _Rbrace {
  2691  			s.Results = p.exprList()
  2692  		}
  2693  		return s
  2694  
  2695  	case _Semi:
  2696  		s := new(EmptyStmt)
  2697  		s.pos = p.pos()
  2698  		return s
  2699  	}
  2700  
  2701  	return nil
  2702  }
  2703  
  2704  
  2705  func (p *parser) stmtList() (l []Stmt) {
  2706  	if trace {
  2707  		defer p.trace("stmtList")()
  2708  	}
  2709  
  2710  	for p.tok != _EOF && p.tok != _Rbrace && p.tok != _Case && p.tok != _Default {
  2711  		s := p.stmtOrNil()
  2712  		p.clearPragma()
  2713  		if s == nil {
  2714  			break
  2715  		}
  2716  		l = append(l, s)
  2717  		
  2718  		if !p.got(_Semi) && p.tok != _Rbrace {
  2719  			p.syntaxError("at end of statement")
  2720  			p.advance(_Semi, _Rbrace, _Case, _Default)
  2721  			p.got(_Semi) 
  2722  		}
  2723  	}
  2724  	return
  2725  }
  2726  
  2727  
  2728  
  2729  
  2730  
  2731  
  2732  func (p *parser) argList() (list []Expr, hasDots bool) {
  2733  	if trace {
  2734  		defer p.trace("argList")()
  2735  	}
  2736  
  2737  	p.xnest++
  2738  	p.list("argument list", _Comma, _Rparen, func() bool {
  2739  		list = append(list, p.expr())
  2740  		hasDots = p.got(_DotDotDot)
  2741  		return hasDots
  2742  	})
  2743  	p.xnest--
  2744  
  2745  	return
  2746  }
  2747  
  2748  
  2749  
  2750  
  2751  func (p *parser) name() *Name {
  2752  	
  2753  
  2754  	if p.tok == _Name {
  2755  		n := NewName(p.pos(), p.lit)
  2756  		p.next()
  2757  		return n
  2758  	}
  2759  
  2760  	n := NewName(p.pos(), "_")
  2761  	p.syntaxError("expected name")
  2762  	p.advance()
  2763  	return n
  2764  }
  2765  
  2766  
  2767  
  2768  func (p *parser) nameList(first *Name) []*Name {
  2769  	if trace {
  2770  		defer p.trace("nameList")()
  2771  	}
  2772  
  2773  	if debug && first == nil {
  2774  		panic("first name not provided")
  2775  	}
  2776  
  2777  	l := []*Name{first}
  2778  	for p.got(_Comma) {
  2779  		l = append(l, p.name())
  2780  	}
  2781  
  2782  	return l
  2783  }
  2784  
  2785  
  2786  func (p *parser) qualifiedName(name *Name) Expr {
  2787  	if trace {
  2788  		defer p.trace("qualifiedName")()
  2789  	}
  2790  
  2791  	var x Expr
  2792  	switch {
  2793  	case name != nil:
  2794  		x = name
  2795  	case p.tok == _Name:
  2796  		x = p.name()
  2797  	default:
  2798  		x = NewName(p.pos(), "_")
  2799  		p.syntaxError("expected name")
  2800  		p.advance(_Dot, _Semi, _Rbrace)
  2801  	}
  2802  
  2803  	if p.tok == _Dot {
  2804  		s := new(SelectorExpr)
  2805  		s.pos = p.pos()
  2806  		p.next()
  2807  		s.X = x
  2808  		s.Sel = p.name()
  2809  		x = s
  2810  	}
  2811  
  2812  	if p.tok == _Lbrack {
  2813  		x = p.typeInstance(x)
  2814  	}
  2815  
  2816  	return x
  2817  }
  2818  
  2819  
  2820  func (p *parser) exprList() Expr {
  2821  	if trace {
  2822  		defer p.trace("exprList")()
  2823  	}
  2824  
  2825  	x := p.expr()
  2826  	if p.got(_Comma) {
  2827  		list := []Expr{x, p.expr()}
  2828  		for p.got(_Comma) {
  2829  			list = append(list, p.expr())
  2830  		}
  2831  		t := new(ListExpr)
  2832  		t.pos = x.Pos()
  2833  		t.ElemList = list
  2834  		x = t
  2835  	}
  2836  	return x
  2837  }
  2838  
  2839  
  2840  
  2841  
  2842  
  2843  
  2844  
  2845  
  2846  
  2847  func (p *parser) typeList(strict bool) (x Expr, comma bool) {
  2848  	if trace {
  2849  		defer p.trace("typeList")()
  2850  	}
  2851  
  2852  	p.xnest++
  2853  	if strict {
  2854  		x = p.type_()
  2855  	} else {
  2856  		x = p.expr()
  2857  	}
  2858  	if p.got(_Comma) {
  2859  		comma = true
  2860  		if t := p.typeOrNil(); t != nil {
  2861  			list := []Expr{x, t}
  2862  			for p.got(_Comma) {
  2863  				if t = p.typeOrNil(); t == nil {
  2864  					break
  2865  				}
  2866  				list = append(list, t)
  2867  			}
  2868  			l := new(ListExpr)
  2869  			l.pos = x.Pos() 
  2870  			l.ElemList = list
  2871  			x = l
  2872  		}
  2873  	}
  2874  	p.xnest--
  2875  	return
  2876  }
  2877  
  2878  
  2879  func Unparen(x Expr) Expr {
  2880  	for {
  2881  		p, ok := x.(*ParenExpr)
  2882  		if !ok {
  2883  			break
  2884  		}
  2885  		x = p.X
  2886  	}
  2887  	return x
  2888  }
  2889  
  2890  
  2891  func UnpackListExpr(x Expr) []Expr {
  2892  	switch x := x.(type) {
  2893  	case nil:
  2894  		return nil
  2895  	case *ListExpr:
  2896  		return x.ElemList
  2897  	default:
  2898  		return []Expr{x}
  2899  	}
  2900  }
  2901  
View as plain text