Home | History | Annotate | Download | only in syntax
      1 // Copyright 2016 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package syntax
      6 
      7 import (
      8 	"cmd/internal/src"
      9 	"fmt"
     10 	"io"
     11 	"strconv"
     12 	"strings"
     13 )
     14 
     15 const debug = false
     16 const trace = false
     17 
     18 type parser struct {
     19 	base  *src.PosBase
     20 	errh  ErrorHandler
     21 	fileh FilenameHandler
     22 	mode  Mode
     23 	scanner
     24 
     25 	first  error  // first error encountered
     26 	errcnt int    // number of errors encountered
     27 	pragma Pragma // pragma flags
     28 
     29 	fnest  int    // function nesting level (for error handling)
     30 	xnest  int    // expression nesting level (for complit ambiguity resolution)
     31 	indent []byte // tracing support
     32 }
     33 
     34 func (p *parser) init(base *src.PosBase, r io.Reader, errh ErrorHandler, pragh PragmaHandler, fileh FilenameHandler, mode Mode) {
     35 	p.base = base
     36 	p.errh = errh
     37 	p.fileh = fileh
     38 	p.mode = mode
     39 	p.scanner.init(
     40 		r,
     41 		// Error and pragma handlers for scanner.
     42 		// Because the (line, col) positions passed to these
     43 		// handlers are always at or after the current reading
     44 		// position, it is save to use the most recent position
     45 		// base to compute the corresponding Pos value.
     46 		func(line, col uint, msg string) {
     47 			p.error_at(p.pos_at(line, col), msg)
     48 		},
     49 		func(line, col uint, text string) {
     50 			if strings.HasPrefix(text, "line ") {
     51 				p.updateBase(line, col+5, text[5:])
     52 				return
     53 			}
     54 			if pragh != nil {
     55 				p.pragma |= pragh(p.pos_at(line, col), text)
     56 			}
     57 		},
     58 	)
     59 
     60 	p.first = nil
     61 	p.errcnt = 0
     62 	p.pragma = 0
     63 
     64 	p.fnest = 0
     65 	p.xnest = 0
     66 	p.indent = nil
     67 }
     68 
     69 const lineMax = 1<<24 - 1 // TODO(gri) this limit is defined for src.Pos - fix
     70 
     71 func (p *parser) updateBase(line, col uint, text string) {
     72 	// Want to use LastIndexByte below but it's not defined in Go1.4 and bootstrap fails.
     73 	i := strings.LastIndex(text, ":") // look from right (Windows filenames may contain ':')
     74 	if i < 0 {
     75 		return // ignore (not a line directive)
     76 	}
     77 	nstr := text[i+1:]
     78 	n, err := strconv.Atoi(nstr)
     79 	if err != nil || n <= 0 || n > lineMax {
     80 		p.error_at(p.pos_at(line, col+uint(i+1)), "invalid line number: "+nstr)
     81 		return
     82 	}
     83 	filename := text[:i]
     84 	absFilename := filename
     85 	if p.fileh != nil {
     86 		absFilename = p.fileh(filename)
     87 	}
     88 	p.base = src.NewLinePragmaBase(src.MakePos(p.base.Pos().Base(), line, col), filename, absFilename, uint(n))
     89 }
     90 
     91 func (p *parser) got(tok token) bool {
     92 	if p.tok == tok {
     93 		p.next()
     94 		return true
     95 	}
     96 	return false
     97 }
     98 
     99 func (p *parser) want(tok token) {
    100 	if !p.got(tok) {
    101 		p.syntax_error("expecting " + tokstring(tok))
    102 		p.advance()
    103 	}
    104 }
    105 
    106 // ----------------------------------------------------------------------------
    107 // Error handling
    108 
    109 // pos_at returns the Pos value for (line, col) and the current position base.
    110 func (p *parser) pos_at(line, col uint) src.Pos {
    111 	return src.MakePos(p.base, line, col)
    112 }
    113 
    114 // error reports an error at the given position.
    115 func (p *parser) error_at(pos src.Pos, msg string) {
    116 	err := Error{pos, msg}
    117 	if p.first == nil {
    118 		p.first = err
    119 	}
    120 	p.errcnt++
    121 	if p.errh == nil {
    122 		panic(p.first)
    123 	}
    124 	p.errh(err)
    125 }
    126 
    127 // syntax_error_at reports a syntax error at the given position.
    128 func (p *parser) syntax_error_at(pos src.Pos, msg string) {
    129 	if trace {
    130 		p.print("syntax error: " + msg)
    131 	}
    132 
    133 	if p.tok == _EOF && p.first != nil {
    134 		return // avoid meaningless follow-up errors
    135 	}
    136 
    137 	// add punctuation etc. as needed to msg
    138 	switch {
    139 	case msg == "":
    140 		// nothing to do
    141 	case strings.HasPrefix(msg, "in"), strings.HasPrefix(msg, "at"), strings.HasPrefix(msg, "after"):
    142 		msg = " " + msg
    143 	case strings.HasPrefix(msg, "expecting"):
    144 		msg = ", " + msg
    145 	default:
    146 		// plain error - we don't care about current token
    147 		p.error_at(pos, "syntax error: "+msg)
    148 		return
    149 	}
    150 
    151 	// determine token string
    152 	var tok string
    153 	switch p.tok {
    154 	case _Name, _Semi:
    155 		tok = p.lit
    156 	case _Literal:
    157 		tok = "literal " + p.lit
    158 	case _Operator:
    159 		tok = p.op.String()
    160 	case _AssignOp:
    161 		tok = p.op.String() + "="
    162 	case _IncOp:
    163 		tok = p.op.String()
    164 		tok += tok
    165 	default:
    166 		tok = tokstring(p.tok)
    167 	}
    168 
    169 	p.error_at(pos, "syntax error: unexpected "+tok+msg)
    170 }
    171 
    172 // tokstring returns the English word for selected punctuation tokens
    173 // for more readable error messages.
    174 func tokstring(tok token) string {
    175 	switch tok {
    176 	case _Comma:
    177 		return "comma"
    178 	case _Semi:
    179 		return "semicolon or newline"
    180 	}
    181 	return tok.String()
    182 }
    183 
    184 // Convenience methods using the current token position.
    185 func (p *parser) pos() src.Pos            { return p.pos_at(p.line, p.col) }
    186 func (p *parser) error(msg string)        { p.error_at(p.pos(), msg) }
    187 func (p *parser) syntax_error(msg string) { p.syntax_error_at(p.pos(), msg) }
    188 
    189 // The stopset contains keywords that start a statement.
    190 // They are good synchronization points in case of syntax
    191 // errors and (usually) shouldn't be skipped over.
    192 const stopset uint64 = 1<<_Break |
    193 	1<<_Const |
    194 	1<<_Continue |
    195 	1<<_Defer |
    196 	1<<_Fallthrough |
    197 	1<<_For |
    198 	1<<_Go |
    199 	1<<_Goto |
    200 	1<<_If |
    201 	1<<_Return |
    202 	1<<_Select |
    203 	1<<_Switch |
    204 	1<<_Type |
    205 	1<<_Var
    206 
    207 // Advance consumes tokens until it finds a token of the stopset or followlist.
    208 // The stopset is only considered if we are inside a function (p.fnest > 0).
    209 // The followlist is the list of valid tokens that can follow a production;
    210 // if it is empty, exactly one (non-EOF) token is consumed to ensure progress.
    211 func (p *parser) advance(followlist ...token) {
    212 	if trace {
    213 		p.print(fmt.Sprintf("advance %s", followlist))
    214 	}
    215 
    216 	// compute follow set
    217 	// (not speed critical, advance is only called in error situations)
    218 	var followset uint64 = 1 << _EOF // don't skip over EOF
    219 	if len(followlist) > 0 {
    220 		if p.fnest > 0 {
    221 			followset |= stopset
    222 		}
    223 		for _, tok := range followlist {
    224 			followset |= 1 << tok
    225 		}
    226 	}
    227 
    228 	for !contains(followset, p.tok) {
    229 		if trace {
    230 			p.print("skip " + p.tok.String())
    231 		}
    232 		p.next()
    233 		if len(followlist) == 0 {
    234 			break
    235 		}
    236 	}
    237 
    238 	if trace {
    239 		p.print("next " + p.tok.String())
    240 	}
    241 }
    242 
    243 // usage: defer p.trace(msg)()
    244 func (p *parser) trace(msg string) func() {
    245 	p.print(msg + " (")
    246 	const tab = ". "
    247 	p.indent = append(p.indent, tab...)
    248 	return func() {
    249 		p.indent = p.indent[:len(p.indent)-len(tab)]
    250 		if x := recover(); x != nil {
    251 			panic(x) // skip print_trace
    252 		}
    253 		p.print(")")
    254 	}
    255 }
    256 
    257 func (p *parser) print(msg string) {
    258 	fmt.Printf("%5d: %s%s\n", p.line, p.indent, msg)
    259 }
    260 
    261 // ----------------------------------------------------------------------------
    262 // Package files
    263 //
    264 // Parse methods are annotated with matching Go productions as appropriate.
    265 // The annotations are intended as guidelines only since a single Go grammar
    266 // rule may be covered by multiple parse methods and vice versa.
    267 //
    268 // Excluding methods returning slices, parse methods named xOrNil may return
    269 // nil; all others are expected to return a valid non-nil node.
    270 
    271 // SourceFile = PackageClause ";" { ImportDecl ";" } { TopLevelDecl ";" } .
    272 func (p *parser) fileOrNil() *File {
    273 	if trace {
    274 		defer p.trace("file")()
    275 	}
    276 
    277 	f := new(File)
    278 	f.pos = p.pos()
    279 
    280 	// PackageClause
    281 	if !p.got(_Package) {
    282 		p.syntax_error("package statement must be first")
    283 		return nil
    284 	}
    285 	f.PkgName = p.name()
    286 	p.want(_Semi)
    287 
    288 	// don't bother continuing if package clause has errors
    289 	if p.first != nil {
    290 		return nil
    291 	}
    292 
    293 	// { ImportDecl ";" }
    294 	for p.got(_Import) {
    295 		f.DeclList = p.appendGroup(f.DeclList, p.importDecl)
    296 		p.want(_Semi)
    297 	}
    298 
    299 	// { TopLevelDecl ";" }
    300 	for p.tok != _EOF {
    301 		switch p.tok {
    302 		case _Const:
    303 			p.next()
    304 			f.DeclList = p.appendGroup(f.DeclList, p.constDecl)
    305 
    306 		case _Type:
    307 			p.next()
    308 			f.DeclList = p.appendGroup(f.DeclList, p.typeDecl)
    309 
    310 		case _Var:
    311 			p.next()
    312 			f.DeclList = p.appendGroup(f.DeclList, p.varDecl)
    313 
    314 		case _Func:
    315 			p.next()
    316 			if d := p.funcDeclOrNil(); d != nil {
    317 				f.DeclList = append(f.DeclList, d)
    318 			}
    319 
    320 		default:
    321 			if p.tok == _Lbrace && len(f.DeclList) > 0 && isEmptyFuncDecl(f.DeclList[len(f.DeclList)-1]) {
    322 				// opening { of function declaration on next line
    323 				p.syntax_error("unexpected semicolon or newline before {")
    324 			} else {
    325 				p.syntax_error("non-declaration statement outside function body")
    326 			}
    327 			p.advance(_Const, _Type, _Var, _Func)
    328 			continue
    329 		}
    330 
    331 		// Reset p.pragma BEFORE advancing to the next token (consuming ';')
    332 		// since comments before may set pragmas for the next function decl.
    333 		p.pragma = 0
    334 
    335 		if p.tok != _EOF && !p.got(_Semi) {
    336 			p.syntax_error("after top level declaration")
    337 			p.advance(_Const, _Type, _Var, _Func)
    338 		}
    339 	}
    340 	// p.tok == _EOF
    341 
    342 	f.Lines = p.source.line
    343 
    344 	return f
    345 }
    346 
    347 func isEmptyFuncDecl(dcl Decl) bool {
    348 	f, ok := dcl.(*FuncDecl)
    349 	return ok && f.Body == nil
    350 }
    351 
    352 // ----------------------------------------------------------------------------
    353 // Declarations
    354 
    355 // list parses a possibly empty, sep-separated list, optionally
    356 // followed by sep and enclosed by ( and ) or { and }. open is
    357 // one of _Lparen, or _Lbrace, sep is one of _Comma or _Semi,
    358 // and close is expected to be the (closing) opposite of open.
    359 // For each list element, f is called. After f returns true, no
    360 // more list elements are accepted. list returns the position
    361 // of the closing token.
    362 //
    363 // list = "(" { f sep } ")" |
    364 //        "{" { f sep } "}" . // sep is optional before ")" or "}"
    365 //
    366 func (p *parser) list(open, sep, close token, f func() bool) src.Pos {
    367 	p.want(open)
    368 
    369 	var done bool
    370 	for p.tok != _EOF && p.tok != close && !done {
    371 		done = f()
    372 		// sep is optional before close
    373 		if !p.got(sep) && p.tok != close {
    374 			p.syntax_error(fmt.Sprintf("expecting %s or %s", tokstring(sep), tokstring(close)))
    375 			p.advance(_Rparen, _Rbrack, _Rbrace)
    376 			if p.tok != close {
    377 				// position could be better but we had an error so we don't care
    378 				return p.pos()
    379 			}
    380 		}
    381 	}
    382 
    383 	pos := p.pos()
    384 	p.want(close)
    385 	return pos
    386 }
    387 
    388 // appendGroup(f) = f | "(" { f ";" } ")" . // ";" is optional before ")"
    389 func (p *parser) appendGroup(list []Decl, f func(*Group) Decl) []Decl {
    390 	if p.tok == _Lparen {
    391 		g := new(Group)
    392 		p.list(_Lparen, _Semi, _Rparen, func() bool {
    393 			list = append(list, f(g))
    394 			return false
    395 		})
    396 	} else {
    397 		list = append(list, f(nil))
    398 	}
    399 
    400 	if debug {
    401 		for _, d := range list {
    402 			if d == nil {
    403 				panic("nil list entry")
    404 			}
    405 		}
    406 	}
    407 
    408 	return list
    409 }
    410 
    411 // ImportSpec = [ "." | PackageName ] ImportPath .
    412 // ImportPath = string_lit .
    413 func (p *parser) importDecl(group *Group) Decl {
    414 	if trace {
    415 		defer p.trace("importDecl")()
    416 	}
    417 
    418 	d := new(ImportDecl)
    419 	d.pos = p.pos()
    420 
    421 	switch p.tok {
    422 	case _Name:
    423 		d.LocalPkgName = p.name()
    424 	case _Dot:
    425 		d.LocalPkgName = p.newName(".")
    426 		p.next()
    427 	}
    428 	d.Path = p.oliteral()
    429 	if d.Path == nil {
    430 		p.syntax_error("missing import path")
    431 		p.advance(_Semi, _Rparen)
    432 		return nil
    433 	}
    434 	d.Group = group
    435 
    436 	return d
    437 }
    438 
    439 // ConstSpec = IdentifierList [ [ Type ] "=" ExpressionList ] .
    440 func (p *parser) constDecl(group *Group) Decl {
    441 	if trace {
    442 		defer p.trace("constDecl")()
    443 	}
    444 
    445 	d := new(ConstDecl)
    446 	d.pos = p.pos()
    447 
    448 	d.NameList = p.nameList(p.name())
    449 	if p.tok != _EOF && p.tok != _Semi && p.tok != _Rparen {
    450 		d.Type = p.typeOrNil()
    451 		if p.got(_Assign) {
    452 			d.Values = p.exprList()
    453 		}
    454 	}
    455 	d.Group = group
    456 
    457 	return d
    458 }
    459 
    460 // TypeSpec = identifier [ "=" ] Type .
    461 func (p *parser) typeDecl(group *Group) Decl {
    462 	if trace {
    463 		defer p.trace("typeDecl")()
    464 	}
    465 
    466 	d := new(TypeDecl)
    467 	d.pos = p.pos()
    468 
    469 	d.Name = p.name()
    470 	d.Alias = p.got(_Assign)
    471 	d.Type = p.typeOrNil()
    472 	if d.Type == nil {
    473 		d.Type = p.bad()
    474 		p.syntax_error("in type declaration")
    475 		p.advance(_Semi, _Rparen)
    476 	}
    477 	d.Group = group
    478 	d.Pragma = p.pragma
    479 
    480 	return d
    481 }
    482 
    483 // VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
    484 func (p *parser) varDecl(group *Group) Decl {
    485 	if trace {
    486 		defer p.trace("varDecl")()
    487 	}
    488 
    489 	d := new(VarDecl)
    490 	d.pos = p.pos()
    491 
    492 	d.NameList = p.nameList(p.name())
    493 	if p.got(_Assign) {
    494 		d.Values = p.exprList()
    495 	} else {
    496 		d.Type = p.type_()
    497 		if p.got(_Assign) {
    498 			d.Values = p.exprList()
    499 		}
    500 	}
    501 	d.Group = group
    502 
    503 	return d
    504 }
    505 
    506 // FunctionDecl = "func" FunctionName ( Function | Signature ) .
    507 // FunctionName = identifier .
    508 // Function     = Signature FunctionBody .
    509 // MethodDecl   = "func" Receiver MethodName ( Function | Signature ) .
    510 // Receiver     = Parameters .
    511 func (p *parser) funcDeclOrNil() *FuncDecl {
    512 	if trace {
    513 		defer p.trace("funcDecl")()
    514 	}
    515 
    516 	f := new(FuncDecl)
    517 	f.pos = p.pos()
    518 
    519 	if p.tok == _Lparen {
    520 		rcvr := p.paramList()
    521 		switch len(rcvr) {
    522 		case 0:
    523 			p.error("method has no receiver")
    524 		default:
    525 			p.error("method has multiple receivers")
    526 			fallthrough
    527 		case 1:
    528 			f.Recv = rcvr[0]
    529 		}
    530 	}
    531 
    532 	if p.tok != _Name {
    533 		p.syntax_error("expecting name or (")
    534 		p.advance(_Lbrace, _Semi)
    535 		return nil
    536 	}
    537 
    538 	f.Name = p.name()
    539 	f.Type = p.funcType()
    540 	if p.tok == _Lbrace {
    541 		f.Body = p.funcBody()
    542 	}
    543 	f.Pragma = p.pragma
    544 
    545 	return f
    546 }
    547 
    548 func (p *parser) funcBody() *BlockStmt {
    549 	p.fnest++
    550 	errcnt := p.errcnt
    551 	body := p.blockStmt("")
    552 	p.fnest--
    553 
    554 	// Don't check branches if there were syntax errors in the function
    555 	// as it may lead to spurious errors (e.g., see test/switch2.go) or
    556 	// possibly crashes due to incomplete syntax trees.
    557 	if p.mode&CheckBranches != 0 && errcnt == p.errcnt {
    558 		checkBranches(body, p.errh)
    559 	}
    560 
    561 	return body
    562 }
    563 
    564 // ----------------------------------------------------------------------------
    565 // Expressions
    566 
    567 func (p *parser) expr() Expr {
    568 	if trace {
    569 		defer p.trace("expr")()
    570 	}
    571 
    572 	return p.binaryExpr(0)
    573 }
    574 
    575 // Expression = UnaryExpr | Expression binary_op Expression .
    576 func (p *parser) binaryExpr(prec int) Expr {
    577 	// don't trace binaryExpr - only leads to overly nested trace output
    578 
    579 	x := p.unaryExpr()
    580 	for (p.tok == _Operator || p.tok == _Star) && p.prec > prec {
    581 		t := new(Operation)
    582 		t.pos = p.pos()
    583 		t.Op = p.op
    584 		t.X = x
    585 		tprec := p.prec
    586 		p.next()
    587 		t.Y = p.binaryExpr(tprec)
    588 		x = t
    589 	}
    590 	return x
    591 }
    592 
    593 // UnaryExpr = PrimaryExpr | unary_op UnaryExpr .
    594 func (p *parser) unaryExpr() Expr {
    595 	if trace {
    596 		defer p.trace("unaryExpr")()
    597 	}
    598 
    599 	switch p.tok {
    600 	case _Operator, _Star:
    601 		switch p.op {
    602 		case Mul, Add, Sub, Not, Xor:
    603 			x := new(Operation)
    604 			x.pos = p.pos()
    605 			x.Op = p.op
    606 			p.next()
    607 			x.X = p.unaryExpr()
    608 			return x
    609 
    610 		case And:
    611 			x := new(Operation)
    612 			x.pos = p.pos()
    613 			x.Op = And
    614 			p.next()
    615 			// unaryExpr may have returned a parenthesized composite literal
    616 			// (see comment in operand) - remove parentheses if any
    617 			x.X = unparen(p.unaryExpr())
    618 			return x
    619 		}
    620 
    621 	case _Arrow:
    622 		// receive op (<-x) or receive-only channel (<-chan E)
    623 		pos := p.pos()
    624 		p.next()
    625 
    626 		// If the next token is _Chan we still don't know if it is
    627 		// a channel (<-chan int) or a receive op (<-chan int(ch)).
    628 		// We only know once we have found the end of the unaryExpr.
    629 
    630 		x := p.unaryExpr()
    631 
    632 		// There are two cases:
    633 		//
    634 		//   <-chan...  => <-x is a channel type
    635 		//   <-x        => <-x is a receive operation
    636 		//
    637 		// In the first case, <- must be re-associated with
    638 		// the channel type parsed already:
    639 		//
    640 		//   <-(chan E)   =>  (<-chan E)
    641 		//   <-(chan<-E)  =>  (<-chan (<-E))
    642 
    643 		if _, ok := x.(*ChanType); ok {
    644 			// x is a channel type => re-associate <-
    645 			dir := SendOnly
    646 			t := x
    647 			for dir == SendOnly {
    648 				c, ok := t.(*ChanType)
    649 				if !ok {
    650 					break
    651 				}
    652 				dir = c.Dir
    653 				if dir == RecvOnly {
    654 					// t is type <-chan E but <-<-chan E is not permitted
    655 					// (report same error as for "type _ <-<-chan E")
    656 					p.syntax_error("unexpected <-, expecting chan")
    657 					// already progressed, no need to advance
    658 				}
    659 				c.Dir = RecvOnly
    660 				t = c.Elem
    661 			}
    662 			if dir == SendOnly {
    663 				// channel dir is <- but channel element E is not a channel
    664 				// (report same error as for "type _ <-chan<-E")
    665 				p.syntax_error(fmt.Sprintf("unexpected %s, expecting chan", String(t)))
    666 				// already progressed, no need to advance
    667 			}
    668 			return x
    669 		}
    670 
    671 		// x is not a channel type => we have a receive op
    672 		o := new(Operation)
    673 		o.pos = pos
    674 		o.Op = Recv
    675 		o.X = x
    676 		return o
    677 	}
    678 
    679 	// TODO(mdempsky): We need parens here so we can report an
    680 	// error for "(x) := true". It should be possible to detect
    681 	// and reject that more efficiently though.
    682 	return p.pexpr(true)
    683 }
    684 
    685 // callStmt parses call-like statements that can be preceded by 'defer' and 'go'.
    686 func (p *parser) callStmt() *CallStmt {
    687 	if trace {
    688 		defer p.trace("callStmt")()
    689 	}
    690 
    691 	s := new(CallStmt)
    692 	s.pos = p.pos()
    693 	s.Tok = p.tok // _Defer or _Go
    694 	p.next()
    695 
    696 	x := p.pexpr(p.tok == _Lparen) // keep_parens so we can report error below
    697 	if t := unparen(x); t != x {
    698 		p.error(fmt.Sprintf("expression in %s must not be parenthesized", s.Tok))
    699 		// already progressed, no need to advance
    700 		x = t
    701 	}
    702 
    703 	cx, ok := x.(*CallExpr)
    704 	if !ok {
    705 		p.error(fmt.Sprintf("expression in %s must be function call", s.Tok))
    706 		// already progressed, no need to advance
    707 		cx = new(CallExpr)
    708 		cx.pos = x.Pos()
    709 		cx.Fun = p.bad()
    710 	}
    711 
    712 	s.Call = cx
    713 	return s
    714 }
    715 
    716 // Operand     = Literal | OperandName | MethodExpr | "(" Expression ")" .
    717 // Literal     = BasicLit | CompositeLit | FunctionLit .
    718 // BasicLit    = int_lit | float_lit | imaginary_lit | rune_lit | string_lit .
    719 // OperandName = identifier | QualifiedIdent.
    720 func (p *parser) operand(keep_parens bool) Expr {
    721 	if trace {
    722 		defer p.trace("operand " + p.tok.String())()
    723 	}
    724 
    725 	switch p.tok {
    726 	case _Name:
    727 		return p.name()
    728 
    729 	case _Literal:
    730 		return p.oliteral()
    731 
    732 	case _Lparen:
    733 		pos := p.pos()
    734 		p.next()
    735 		p.xnest++
    736 		x := p.expr()
    737 		p.xnest--
    738 		p.want(_Rparen)
    739 
    740 		// Optimization: Record presence of ()'s only where needed
    741 		// for error reporting. Don't bother in other cases; it is
    742 		// just a waste of memory and time.
    743 
    744 		// Parentheses are not permitted on lhs of := .
    745 		// switch x.Op {
    746 		// case ONAME, ONONAME, OPACK, OTYPE, OLITERAL, OTYPESW:
    747 		// 	keep_parens = true
    748 		// }
    749 
    750 		// Parentheses are not permitted around T in a composite
    751 		// literal T{}. If the next token is a {, assume x is a
    752 		// composite literal type T (it may not be, { could be
    753 		// the opening brace of a block, but we don't know yet).
    754 		if p.tok == _Lbrace {
    755 			keep_parens = true
    756 		}
    757 
    758 		// Parentheses are also not permitted around the expression
    759 		// in a go/defer statement. In that case, operand is called
    760 		// with keep_parens set.
    761 		if keep_parens {
    762 			px := new(ParenExpr)
    763 			px.pos = pos
    764 			px.X = x
    765 			x = px
    766 		}
    767 		return x
    768 
    769 	case _Func:
    770 		pos := p.pos()
    771 		p.next()
    772 		t := p.funcType()
    773 		if p.tok == _Lbrace {
    774 			p.xnest++
    775 
    776 			f := new(FuncLit)
    777 			f.pos = pos
    778 			f.Type = t
    779 			f.Body = p.funcBody()
    780 
    781 			p.xnest--
    782 			return f
    783 		}
    784 		return t
    785 
    786 	case _Lbrack, _Chan, _Map, _Struct, _Interface:
    787 		return p.type_() // othertype
    788 
    789 	default:
    790 		x := p.bad()
    791 		p.syntax_error("expecting expression")
    792 		p.advance()
    793 		return x
    794 	}
    795 
    796 	// Syntactically, composite literals are operands. Because a complit
    797 	// type may be a qualified identifier which is handled by pexpr
    798 	// (together with selector expressions), complits are parsed there
    799 	// as well (operand is only called from pexpr).
    800 }
    801 
    802 // PrimaryExpr =
    803 // 	Operand |
    804 // 	Conversion |
    805 // 	PrimaryExpr Selector |
    806 // 	PrimaryExpr Index |
    807 // 	PrimaryExpr Slice |
    808 // 	PrimaryExpr TypeAssertion |
    809 // 	PrimaryExpr Arguments .
    810 //
    811 // Selector       = "." identifier .
    812 // Index          = "[" Expression "]" .
    813 // Slice          = "[" ( [ Expression ] ":" [ Expression ] ) |
    814 //                      ( [ Expression ] ":" Expression ":" Expression )
    815 //                  "]" .
    816 // TypeAssertion  = "." "(" Type ")" .
    817 // Arguments      = "(" [ ( ExpressionList | Type [ "," ExpressionList ] ) [ "..." ] [ "," ] ] ")" .
    818 func (p *parser) pexpr(keep_parens bool) Expr {
    819 	if trace {
    820 		defer p.trace("pexpr")()
    821 	}
    822 
    823 	x := p.operand(keep_parens)
    824 
    825 loop:
    826 	for {
    827 		pos := p.pos()
    828 		switch p.tok {
    829 		case _Dot:
    830 			p.next()
    831 			switch p.tok {
    832 			case _Name:
    833 				// pexpr '.' sym
    834 				t := new(SelectorExpr)
    835 				t.pos = pos
    836 				t.X = x
    837 				t.Sel = p.name()
    838 				x = t
    839 
    840 			case _Lparen:
    841 				p.next()
    842 				if p.got(_Type) {
    843 					t := new(TypeSwitchGuard)
    844 					t.pos = pos
    845 					t.X = x
    846 					x = t
    847 				} else {
    848 					t := new(AssertExpr)
    849 					t.pos = pos
    850 					t.X = x
    851 					t.Type = p.expr()
    852 					x = t
    853 				}
    854 				p.want(_Rparen)
    855 
    856 			default:
    857 				p.syntax_error("expecting name or (")
    858 				p.advance(_Semi, _Rparen)
    859 			}
    860 
    861 		case _Lbrack:
    862 			p.next()
    863 			p.xnest++
    864 
    865 			var i Expr
    866 			if p.tok != _Colon {
    867 				i = p.expr()
    868 				if p.got(_Rbrack) {
    869 					// x[i]
    870 					t := new(IndexExpr)
    871 					t.pos = pos
    872 					t.X = x
    873 					t.Index = i
    874 					x = t
    875 					p.xnest--
    876 					break
    877 				}
    878 			}
    879 
    880 			// x[i:...
    881 			t := new(SliceExpr)
    882 			t.pos = pos
    883 			t.X = x
    884 			t.Index[0] = i
    885 			p.want(_Colon)
    886 			if p.tok != _Colon && p.tok != _Rbrack {
    887 				// x[i:j...
    888 				t.Index[1] = p.expr()
    889 			}
    890 			if p.got(_Colon) {
    891 				t.Full = true
    892 				// x[i:j:...]
    893 				if t.Index[1] == nil {
    894 					p.error("middle index required in 3-index slice")
    895 				}
    896 				if p.tok != _Rbrack {
    897 					// x[i:j:k...
    898 					t.Index[2] = p.expr()
    899 				} else {
    900 					p.error("final index required in 3-index slice")
    901 				}
    902 			}
    903 			p.want(_Rbrack)
    904 
    905 			x = t
    906 			p.xnest--
    907 
    908 		case _Lparen:
    909 			t := new(CallExpr)
    910 			t.pos = pos
    911 			t.Fun = x
    912 			t.ArgList, t.HasDots = p.argList()
    913 			x = t
    914 
    915 		case _Lbrace:
    916 			// operand may have returned a parenthesized complit
    917 			// type; accept it but complain if we have a complit
    918 			t := unparen(x)
    919 			// determine if '{' belongs to a composite literal or a block statement
    920 			complit_ok := false
    921 			switch t.(type) {
    922 			case *Name, *SelectorExpr:
    923 				if p.xnest >= 0 {
    924 					// x is considered a composite literal type
    925 					complit_ok = true
    926 				}
    927 			case *ArrayType, *SliceType, *StructType, *MapType:
    928 				// x is a comptype
    929 				complit_ok = true
    930 			}
    931 			if !complit_ok {
    932 				break loop
    933 			}
    934 			if t != x {
    935 				p.syntax_error("cannot parenthesize type in composite literal")
    936 				// already progressed, no need to advance
    937 			}
    938 			n := p.complitexpr()
    939 			n.Type = x
    940 			x = n
    941 
    942 		default:
    943 			break loop
    944 		}
    945 	}
    946 
    947 	return x
    948 }
    949 
    950 // Element = Expression | LiteralValue .
    951 func (p *parser) bare_complitexpr() Expr {
    952 	if trace {
    953 		defer p.trace("bare_complitexpr")()
    954 	}
    955 
    956 	if p.tok == _Lbrace {
    957 		// '{' start_complit braced_keyval_list '}'
    958 		return p.complitexpr()
    959 	}
    960 
    961 	return p.expr()
    962 }
    963 
    964 // LiteralValue = "{" [ ElementList [ "," ] ] "}" .
    965 func (p *parser) complitexpr() *CompositeLit {
    966 	if trace {
    967 		defer p.trace("complitexpr")()
    968 	}
    969 
    970 	x := new(CompositeLit)
    971 	x.pos = p.pos()
    972 
    973 	p.xnest++
    974 	x.Rbrace = p.list(_Lbrace, _Comma, _Rbrace, func() bool {
    975 		// value
    976 		e := p.bare_complitexpr()
    977 		if p.tok == _Colon {
    978 			// key ':' value
    979 			l := new(KeyValueExpr)
    980 			l.pos = p.pos()
    981 			p.next()
    982 			l.Key = e
    983 			l.Value = p.bare_complitexpr()
    984 			e = l
    985 			x.NKeys++
    986 		}
    987 		x.ElemList = append(x.ElemList, e)
    988 		return false
    989 	})
    990 	p.xnest--
    991 
    992 	return x
    993 }
    994 
    995 // ----------------------------------------------------------------------------
    996 // Types
    997 
    998 func (p *parser) type_() Expr {
    999 	if trace {
   1000 		defer p.trace("type_")()
   1001 	}
   1002 
   1003 	typ := p.typeOrNil()
   1004 	if typ == nil {
   1005 		typ = p.bad()
   1006 		p.syntax_error("expecting type")
   1007 		p.advance()
   1008 	}
   1009 
   1010 	return typ
   1011 }
   1012 
   1013 func newIndirect(pos src.Pos, typ Expr) Expr {
   1014 	o := new(Operation)
   1015 	o.pos = pos
   1016 	o.Op = Mul
   1017 	o.X = typ
   1018 	return o
   1019 }
   1020 
   1021 // typeOrNil is like type_ but it returns nil if there was no type
   1022 // instead of reporting an error.
   1023 //
   1024 // Type     = TypeName | TypeLit | "(" Type ")" .
   1025 // TypeName = identifier | QualifiedIdent .
   1026 // TypeLit  = ArrayType | StructType | PointerType | FunctionType | InterfaceType |
   1027 // 	      SliceType | MapType | Channel_Type .
   1028 func (p *parser) typeOrNil() Expr {
   1029 	if trace {
   1030 		defer p.trace("typeOrNil")()
   1031 	}
   1032 
   1033 	pos := p.pos()
   1034 	switch p.tok {
   1035 	case _Star:
   1036 		// ptrtype
   1037 		p.next()
   1038 		return newIndirect(pos, p.type_())
   1039 
   1040 	case _Arrow:
   1041 		// recvchantype
   1042 		p.next()
   1043 		p.want(_Chan)
   1044 		t := new(ChanType)
   1045 		t.pos = pos
   1046 		t.Dir = RecvOnly
   1047 		t.Elem = p.chanElem()
   1048 		return t
   1049 
   1050 	case _Func:
   1051 		// fntype
   1052 		p.next()
   1053 		return p.funcType()
   1054 
   1055 	case _Lbrack:
   1056 		// '[' oexpr ']' ntype
   1057 		// '[' _DotDotDot ']' ntype
   1058 		p.next()
   1059 		p.xnest++
   1060 		if p.got(_Rbrack) {
   1061 			// []T
   1062 			p.xnest--
   1063 			t := new(SliceType)
   1064 			t.pos = pos
   1065 			t.Elem = p.type_()
   1066 			return t
   1067 		}
   1068 
   1069 		// [n]T
   1070 		t := new(ArrayType)
   1071 		t.pos = pos
   1072 		if !p.got(_DotDotDot) {
   1073 			t.Len = p.expr()
   1074 		}
   1075 		p.want(_Rbrack)
   1076 		p.xnest--
   1077 		t.Elem = p.type_()
   1078 		return t
   1079 
   1080 	case _Chan:
   1081 		// _Chan non_recvchantype
   1082 		// _Chan _Comm ntype
   1083 		p.next()
   1084 		t := new(ChanType)
   1085 		t.pos = pos
   1086 		if p.got(_Arrow) {
   1087 			t.Dir = SendOnly
   1088 		}
   1089 		t.Elem = p.chanElem()
   1090 		return t
   1091 
   1092 	case _Map:
   1093 		// _Map '[' ntype ']' ntype
   1094 		p.next()
   1095 		p.want(_Lbrack)
   1096 		t := new(MapType)
   1097 		t.pos = pos
   1098 		t.Key = p.type_()
   1099 		p.want(_Rbrack)
   1100 		t.Value = p.type_()
   1101 		return t
   1102 
   1103 	case _Struct:
   1104 		return p.structType()
   1105 
   1106 	case _Interface:
   1107 		return p.interfaceType()
   1108 
   1109 	case _Name:
   1110 		return p.dotname(p.name())
   1111 
   1112 	case _Lparen:
   1113 		p.next()
   1114 		t := p.type_()
   1115 		p.want(_Rparen)
   1116 		return t
   1117 	}
   1118 
   1119 	return nil
   1120 }
   1121 
   1122 func (p *parser) funcType() *FuncType {
   1123 	if trace {
   1124 		defer p.trace("funcType")()
   1125 	}
   1126 
   1127 	typ := new(FuncType)
   1128 	typ.pos = p.pos()
   1129 	typ.ParamList = p.paramList()
   1130 	typ.ResultList = p.funcResult()
   1131 
   1132 	return typ
   1133 }
   1134 
   1135 func (p *parser) chanElem() Expr {
   1136 	if trace {
   1137 		defer p.trace("chanElem")()
   1138 	}
   1139 
   1140 	typ := p.typeOrNil()
   1141 	if typ == nil {
   1142 		typ = p.bad()
   1143 		p.syntax_error("missing channel element type")
   1144 		// assume element type is simply absent - don't advance
   1145 	}
   1146 
   1147 	return typ
   1148 }
   1149 
   1150 func (p *parser) dotname(name *Name) Expr {
   1151 	if trace {
   1152 		defer p.trace("dotname")()
   1153 	}
   1154 
   1155 	if p.tok == _Dot {
   1156 		s := new(SelectorExpr)
   1157 		s.pos = p.pos()
   1158 		p.next()
   1159 		s.X = name
   1160 		s.Sel = p.name()
   1161 		return s
   1162 	}
   1163 	return name
   1164 }
   1165 
   1166 // StructType = "struct" "{" { FieldDecl ";" } "}" .
   1167 func (p *parser) structType() *StructType {
   1168 	if trace {
   1169 		defer p.trace("structType")()
   1170 	}
   1171 
   1172 	typ := new(StructType)
   1173 	typ.pos = p.pos()
   1174 
   1175 	p.want(_Struct)
   1176 	p.list(_Lbrace, _Semi, _Rbrace, func() bool {
   1177 		p.fieldDecl(typ)
   1178 		return false
   1179 	})
   1180 
   1181 	return typ
   1182 }
   1183 
   1184 // InterfaceType = "interface" "{" { MethodSpec ";" } "}" .
   1185 func (p *parser) interfaceType() *InterfaceType {
   1186 	if trace {
   1187 		defer p.trace("interfaceType")()
   1188 	}
   1189 
   1190 	typ := new(InterfaceType)
   1191 	typ.pos = p.pos()
   1192 
   1193 	p.want(_Interface)
   1194 	p.list(_Lbrace, _Semi, _Rbrace, func() bool {
   1195 		if m := p.methodDecl(); m != nil {
   1196 			typ.MethodList = append(typ.MethodList, m)
   1197 		}
   1198 		return false
   1199 	})
   1200 
   1201 	return typ
   1202 }
   1203 
   1204 // Result = Parameters | Type .
   1205 func (p *parser) funcResult() []*Field {
   1206 	if trace {
   1207 		defer p.trace("funcResult")()
   1208 	}
   1209 
   1210 	if p.tok == _Lparen {
   1211 		return p.paramList()
   1212 	}
   1213 
   1214 	pos := p.pos()
   1215 	if typ := p.typeOrNil(); typ != nil {
   1216 		f := new(Field)
   1217 		f.pos = pos
   1218 		f.Type = typ
   1219 		return []*Field{f}
   1220 	}
   1221 
   1222 	return nil
   1223 }
   1224 
   1225 func (p *parser) addField(styp *StructType, pos src.Pos, name *Name, typ Expr, tag *BasicLit) {
   1226 	if tag != nil {
   1227 		for i := len(styp.FieldList) - len(styp.TagList); i > 0; i-- {
   1228 			styp.TagList = append(styp.TagList, nil)
   1229 		}
   1230 		styp.TagList = append(styp.TagList, tag)
   1231 	}
   1232 
   1233 	f := new(Field)
   1234 	f.pos = pos
   1235 	f.Name = name
   1236 	f.Type = typ
   1237 	styp.FieldList = append(styp.FieldList, f)
   1238 
   1239 	if debug && tag != nil && len(styp.FieldList) != len(styp.TagList) {
   1240 		panic("inconsistent struct field list")
   1241 	}
   1242 }
   1243 
   1244 // FieldDecl      = (IdentifierList Type | AnonymousField) [ Tag ] .
   1245 // AnonymousField = [ "*" ] TypeName .
   1246 // Tag            = string_lit .
   1247 func (p *parser) fieldDecl(styp *StructType) {
   1248 	if trace {
   1249 		defer p.trace("fieldDecl")()
   1250 	}
   1251 
   1252 	pos := p.pos()
   1253 	switch p.tok {
   1254 	case _Name:
   1255 		name := p.name()
   1256 		if p.tok == _Dot || p.tok == _Literal || p.tok == _Semi || p.tok == _Rbrace {
   1257 			// embed oliteral
   1258 			typ := p.qualifiedName(name)
   1259 			tag := p.oliteral()
   1260 			p.addField(styp, pos, nil, typ, tag)
   1261 			return
   1262 		}
   1263 
   1264 		// new_name_list ntype oliteral
   1265 		names := p.nameList(name)
   1266 		typ := p.type_()
   1267 		tag := p.oliteral()
   1268 
   1269 		for _, name := range names {
   1270 			p.addField(styp, name.Pos(), name, typ, tag)
   1271 		}
   1272 
   1273 	case _Lparen:
   1274 		p.next()
   1275 		if p.tok == _Star {
   1276 			// '(' '*' embed ')' oliteral
   1277 			pos := p.pos()
   1278 			p.next()
   1279 			typ := newIndirect(pos, p.qualifiedName(nil))
   1280 			p.want(_Rparen)
   1281 			tag := p.oliteral()
   1282 			p.addField(styp, pos, nil, typ, tag)
   1283 			p.syntax_error("cannot parenthesize embedded type")
   1284 
   1285 		} else {
   1286 			// '(' embed ')' oliteral
   1287 			typ := p.qualifiedName(nil)
   1288 			p.want(_Rparen)
   1289 			tag := p.oliteral()
   1290 			p.addField(styp, pos, nil, typ, tag)
   1291 			p.syntax_error("cannot parenthesize embedded type")
   1292 		}
   1293 
   1294 	case _Star:
   1295 		p.next()
   1296 		if p.got(_Lparen) {
   1297 			// '*' '(' embed ')' oliteral
   1298 			typ := newIndirect(pos, p.qualifiedName(nil))
   1299 			p.want(_Rparen)
   1300 			tag := p.oliteral()
   1301 			p.addField(styp, pos, nil, typ, tag)
   1302 			p.syntax_error("cannot parenthesize embedded type")
   1303 
   1304 		} else {
   1305 			// '*' embed oliteral
   1306 			typ := newIndirect(pos, p.qualifiedName(nil))
   1307 			tag := p.oliteral()
   1308 			p.addField(styp, pos, nil, typ, tag)
   1309 		}
   1310 
   1311 	default:
   1312 		p.syntax_error("expecting field name or embedded type")
   1313 		p.advance(_Semi, _Rbrace)
   1314 	}
   1315 }
   1316 
   1317 func (p *parser) oliteral() *BasicLit {
   1318 	if p.tok == _Literal {
   1319 		b := new(BasicLit)
   1320 		b.pos = p.pos()
   1321 		b.Value = p.lit
   1322 		b.Kind = p.kind
   1323 		p.next()
   1324 		return b
   1325 	}
   1326 	return nil
   1327 }
   1328 
   1329 // MethodSpec        = MethodName Signature | InterfaceTypeName .
   1330 // MethodName        = identifier .
   1331 // InterfaceTypeName = TypeName .
   1332 func (p *parser) methodDecl() *Field {
   1333 	if trace {
   1334 		defer p.trace("methodDecl")()
   1335 	}
   1336 
   1337 	switch p.tok {
   1338 	case _Name:
   1339 		name := p.name()
   1340 
   1341 		// accept potential name list but complain
   1342 		hasNameList := false
   1343 		for p.got(_Comma) {
   1344 			p.name()
   1345 			hasNameList = true
   1346 		}
   1347 		if hasNameList {
   1348 			p.syntax_error("name list not allowed in interface type")
   1349 			// already progressed, no need to advance
   1350 		}
   1351 
   1352 		f := new(Field)
   1353 		f.pos = name.Pos()
   1354 		if p.tok != _Lparen {
   1355 			// packname
   1356 			f.Type = p.qualifiedName(name)
   1357 			return f
   1358 		}
   1359 
   1360 		f.Name = name
   1361 		f.Type = p.funcType()
   1362 		return f
   1363 
   1364 	case _Lparen:
   1365 		p.syntax_error("cannot parenthesize embedded type")
   1366 		f := new(Field)
   1367 		f.pos = p.pos()
   1368 		p.next()
   1369 		f.Type = p.qualifiedName(nil)
   1370 		p.want(_Rparen)
   1371 		return f
   1372 
   1373 	default:
   1374 		p.syntax_error("expecting method or interface name")
   1375 		p.advance(_Semi, _Rbrace)
   1376 		return nil
   1377 	}
   1378 }
   1379 
   1380 // ParameterDecl = [ IdentifierList ] [ "..." ] Type .
   1381 func (p *parser) paramDeclOrNil() *Field {
   1382 	if trace {
   1383 		defer p.trace("paramDecl")()
   1384 	}
   1385 
   1386 	f := new(Field)
   1387 	f.pos = p.pos()
   1388 
   1389 	switch p.tok {
   1390 	case _Name:
   1391 		f.Name = p.name()
   1392 		switch p.tok {
   1393 		case _Name, _Star, _Arrow, _Func, _Lbrack, _Chan, _Map, _Struct, _Interface, _Lparen:
   1394 			// sym name_or_type
   1395 			f.Type = p.type_()
   1396 
   1397 		case _DotDotDot:
   1398 			// sym dotdotdot
   1399 			f.Type = p.dotsType()
   1400 
   1401 		case _Dot:
   1402 			// name_or_type
   1403 			// from dotname
   1404 			f.Type = p.dotname(f.Name)
   1405 			f.Name = nil
   1406 		}
   1407 
   1408 	case _Arrow, _Star, _Func, _Lbrack, _Chan, _Map, _Struct, _Interface, _Lparen:
   1409 		// name_or_type
   1410 		f.Type = p.type_()
   1411 
   1412 	case _DotDotDot:
   1413 		// dotdotdot
   1414 		f.Type = p.dotsType()
   1415 
   1416 	default:
   1417 		p.syntax_error("expecting )")
   1418 		p.advance(_Comma, _Rparen)
   1419 		return nil
   1420 	}
   1421 
   1422 	return f
   1423 }
   1424 
   1425 // ...Type
   1426 func (p *parser) dotsType() *DotsType {
   1427 	if trace {
   1428 		defer p.trace("dotsType")()
   1429 	}
   1430 
   1431 	t := new(DotsType)
   1432 	t.pos = p.pos()
   1433 
   1434 	p.want(_DotDotDot)
   1435 	t.Elem = p.typeOrNil()
   1436 	if t.Elem == nil {
   1437 		t.Elem = p.bad()
   1438 		p.syntax_error("final argument in variadic function missing type")
   1439 	}
   1440 
   1441 	return t
   1442 }
   1443 
   1444 // Parameters    = "(" [ ParameterList [ "," ] ] ")" .
   1445 // ParameterList = ParameterDecl { "," ParameterDecl } .
   1446 func (p *parser) paramList() (list []*Field) {
   1447 	if trace {
   1448 		defer p.trace("paramList")()
   1449 	}
   1450 
   1451 	pos := p.pos()
   1452 
   1453 	var named int // number of parameters that have an explicit name and type
   1454 	p.list(_Lparen, _Comma, _Rparen, func() bool {
   1455 		if par := p.paramDeclOrNil(); par != nil {
   1456 			if debug && par.Name == nil && par.Type == nil {
   1457 				panic("parameter without name or type")
   1458 			}
   1459 			if par.Name != nil && par.Type != nil {
   1460 				named++
   1461 			}
   1462 			list = append(list, par)
   1463 		}
   1464 		return false
   1465 	})
   1466 
   1467 	// distribute parameter types
   1468 	if named == 0 {
   1469 		// all unnamed => found names are named types
   1470 		for _, par := range list {
   1471 			if typ := par.Name; typ != nil {
   1472 				par.Type = typ
   1473 				par.Name = nil
   1474 			}
   1475 		}
   1476 	} else if named != len(list) {
   1477 		// some named => all must be named
   1478 		ok := true
   1479 		var typ Expr
   1480 		for i := len(list) - 1; i >= 0; i-- {
   1481 			if par := list[i]; par.Type != nil {
   1482 				typ = par.Type
   1483 				if par.Name == nil {
   1484 					ok = false
   1485 					n := p.newName("_")
   1486 					n.pos = typ.Pos() // correct position
   1487 					par.Name = n
   1488 				}
   1489 			} else if typ != nil {
   1490 				par.Type = typ
   1491 			} else {
   1492 				// par.Type == nil && typ == nil => we only have a par.Name
   1493 				ok = false
   1494 				t := p.bad()
   1495 				t.pos = par.Name.Pos() // correct position
   1496 				par.Type = t
   1497 			}
   1498 		}
   1499 		if !ok {
   1500 			p.syntax_error_at(pos, "mixed named and unnamed function parameters")
   1501 		}
   1502 	}
   1503 
   1504 	return
   1505 }
   1506 
   1507 func (p *parser) bad() *BadExpr {
   1508 	b := new(BadExpr)
   1509 	b.pos = p.pos()
   1510 	return b
   1511 }
   1512 
   1513 // ----------------------------------------------------------------------------
   1514 // Statements
   1515 
   1516 // We represent x++, x-- as assignments x += ImplicitOne, x -= ImplicitOne.
   1517 // ImplicitOne should not be used elsewhere.
   1518 var ImplicitOne = &BasicLit{Value: "1"}
   1519 
   1520 // SimpleStmt = EmptyStmt | ExpressionStmt | SendStmt | IncDecStmt | Assignment | ShortVarDecl .
   1521 func (p *parser) simpleStmt(lhs Expr, rangeOk bool) SimpleStmt {
   1522 	if trace {
   1523 		defer p.trace("simpleStmt")()
   1524 	}
   1525 
   1526 	if rangeOk && p.tok == _Range {
   1527 		// _Range expr
   1528 		if debug && lhs != nil {
   1529 			panic("invalid call of simpleStmt")
   1530 		}
   1531 		return p.newRangeClause(nil, false)
   1532 	}
   1533 
   1534 	if lhs == nil {
   1535 		lhs = p.exprList()
   1536 	}
   1537 
   1538 	if _, ok := lhs.(*ListExpr); !ok && p.tok != _Assign && p.tok != _Define {
   1539 		// expr
   1540 		pos := p.pos()
   1541 		switch p.tok {
   1542 		case _AssignOp:
   1543 			// lhs op= rhs
   1544 			op := p.op
   1545 			p.next()
   1546 			return p.newAssignStmt(pos, op, lhs, p.expr())
   1547 
   1548 		case _IncOp:
   1549 			// lhs++ or lhs--
   1550 			op := p.op
   1551 			p.next()
   1552 			return p.newAssignStmt(pos, op, lhs, ImplicitOne)
   1553 
   1554 		case _Arrow:
   1555 			// lhs <- rhs
   1556 			s := new(SendStmt)
   1557 			s.pos = pos
   1558 			p.next()
   1559 			s.Chan = lhs
   1560 			s.Value = p.expr()
   1561 			return s
   1562 
   1563 		default:
   1564 			// expr
   1565 			s := new(ExprStmt)
   1566 			s.pos = lhs.Pos()
   1567 			s.X = lhs
   1568 			return s
   1569 		}
   1570 	}
   1571 
   1572 	// expr_list
   1573 	pos := p.pos()
   1574 	switch p.tok {
   1575 	case _Assign:
   1576 		p.next()
   1577 
   1578 		if rangeOk && p.tok == _Range {
   1579 			// expr_list '=' _Range expr
   1580 			return p.newRangeClause(lhs, false)
   1581 		}
   1582 
   1583 		// expr_list '=' expr_list
   1584 		return p.newAssignStmt(pos, 0, lhs, p.exprList())
   1585 
   1586 	case _Define:
   1587 		p.next()
   1588 
   1589 		if rangeOk && p.tok == _Range {
   1590 			// expr_list ':=' range expr
   1591 			return p.newRangeClause(lhs, true)
   1592 		}
   1593 
   1594 		// expr_list ':=' expr_list
   1595 		rhs := p.exprList()
   1596 
   1597 		if x, ok := rhs.(*TypeSwitchGuard); ok {
   1598 			switch lhs := lhs.(type) {
   1599 			case *Name:
   1600 				x.Lhs = lhs
   1601 			case *ListExpr:
   1602 				p.error_at(lhs.Pos(), fmt.Sprintf("cannot assign 1 value to %d variables", len(lhs.ElemList)))
   1603 				// make the best of what we have
   1604 				if lhs, ok := lhs.ElemList[0].(*Name); ok {
   1605 					x.Lhs = lhs
   1606 				}
   1607 			default:
   1608 				p.error_at(lhs.Pos(), fmt.Sprintf("invalid variable name %s in type switch", String(lhs)))
   1609 			}
   1610 			s := new(ExprStmt)
   1611 			s.pos = x.Pos()
   1612 			s.X = x
   1613 			return s
   1614 		}
   1615 
   1616 		as := p.newAssignStmt(pos, Def, lhs, rhs)
   1617 		return as
   1618 
   1619 	default:
   1620 		p.syntax_error("expecting := or = or comma")
   1621 		p.advance(_Semi, _Rbrace)
   1622 		// make the best of what we have
   1623 		if x, ok := lhs.(*ListExpr); ok {
   1624 			lhs = x.ElemList[0]
   1625 		}
   1626 		s := new(ExprStmt)
   1627 		s.pos = lhs.Pos()
   1628 		s.X = lhs
   1629 		return s
   1630 	}
   1631 }
   1632 
   1633 func (p *parser) newRangeClause(lhs Expr, def bool) *RangeClause {
   1634 	r := new(RangeClause)
   1635 	r.pos = p.pos()
   1636 	p.next() // consume _Range
   1637 	r.Lhs = lhs
   1638 	r.Def = def
   1639 	r.X = p.expr()
   1640 	return r
   1641 }
   1642 
   1643 func (p *parser) newAssignStmt(pos src.Pos, op Operator, lhs, rhs Expr) *AssignStmt {
   1644 	a := new(AssignStmt)
   1645 	a.pos = pos
   1646 	a.Op = op
   1647 	a.Lhs = lhs
   1648 	a.Rhs = rhs
   1649 	return a
   1650 }
   1651 
   1652 func (p *parser) labeledStmtOrNil(label *Name) Stmt {
   1653 	if trace {
   1654 		defer p.trace("labeledStmt")()
   1655 	}
   1656 
   1657 	s := new(LabeledStmt)
   1658 	s.pos = p.pos()
   1659 	s.Label = label
   1660 
   1661 	p.want(_Colon)
   1662 
   1663 	if p.tok == _Rbrace {
   1664 		// We expect a statement (incl. an empty statement), which must be
   1665 		// terminated by a semicolon. Because semicolons may be omitted before
   1666 		// an _Rbrace, seeing an _Rbrace implies an empty statement.
   1667 		e := new(EmptyStmt)
   1668 		e.pos = p.pos()
   1669 		s.Stmt = e
   1670 		return s
   1671 	}
   1672 
   1673 	s.Stmt = p.stmtOrNil()
   1674 	if s.Stmt != nil {
   1675 		return s
   1676 	}
   1677 
   1678 	// report error at line of ':' token
   1679 	p.syntax_error_at(s.pos, "missing statement after label")
   1680 	// we are already at the end of the labeled statement - no need to advance
   1681 	return nil // avoids follow-on errors (see e.g., fixedbugs/bug274.go)
   1682 }
   1683 
   1684 // context must be a non-empty string unless we know that p.tok == _Lbrace.
   1685 func (p *parser) blockStmt(context string) *BlockStmt {
   1686 	if trace {
   1687 		defer p.trace("blockStmt")()
   1688 	}
   1689 
   1690 	s := new(BlockStmt)
   1691 	s.pos = p.pos()
   1692 
   1693 	// people coming from C may forget that braces are mandatory in Go
   1694 	if !p.got(_Lbrace) {
   1695 		p.syntax_error("expecting { after " + context)
   1696 		p.advance(_Name, _Rbrace)
   1697 		s.Rbrace = p.pos() // in case we found "}"
   1698 		if p.got(_Rbrace) {
   1699 			return s
   1700 		}
   1701 	}
   1702 
   1703 	s.List = p.stmtList()
   1704 	s.Rbrace = p.pos()
   1705 	p.want(_Rbrace)
   1706 
   1707 	return s
   1708 }
   1709 
   1710 func (p *parser) declStmt(f func(*Group) Decl) *DeclStmt {
   1711 	if trace {
   1712 		defer p.trace("declStmt")()
   1713 	}
   1714 
   1715 	s := new(DeclStmt)
   1716 	s.pos = p.pos()
   1717 
   1718 	p.next() // _Const, _Type, or _Var
   1719 	s.DeclList = p.appendGroup(nil, f)
   1720 
   1721 	return s
   1722 }
   1723 
   1724 func (p *parser) forStmt() Stmt {
   1725 	if trace {
   1726 		defer p.trace("forStmt")()
   1727 	}
   1728 
   1729 	s := new(ForStmt)
   1730 	s.pos = p.pos()
   1731 
   1732 	s.Init, s.Cond, s.Post = p.header(_For)
   1733 	s.Body = p.blockStmt("for clause")
   1734 
   1735 	return s
   1736 }
   1737 
   1738 func (p *parser) header(keyword token) (init SimpleStmt, cond Expr, post SimpleStmt) {
   1739 	p.want(keyword)
   1740 
   1741 	if p.tok == _Lbrace {
   1742 		if keyword == _If {
   1743 			p.syntax_error("missing condition in if statement")
   1744 		}
   1745 		return
   1746 	}
   1747 	// p.tok != _Lbrace
   1748 
   1749 	outer := p.xnest
   1750 	p.xnest = -1
   1751 
   1752 	if p.tok != _Semi {
   1753 		// accept potential varDecl but complain
   1754 		if p.got(_Var) {
   1755 			p.syntax_error(fmt.Sprintf("var declaration not allowed in %s initializer", keyword.String()))
   1756 		}
   1757 		init = p.simpleStmt(nil, keyword == _For)
   1758 		// If we have a range clause, we are done (can only happen for keyword == _For).
   1759 		if _, ok := init.(*RangeClause); ok {
   1760 			p.xnest = outer
   1761 			return
   1762 		}
   1763 	}
   1764 
   1765 	var condStmt SimpleStmt
   1766 	var semi struct {
   1767 		pos src.Pos
   1768 		lit string // valid if pos.IsKnown()
   1769 	}
   1770 	if p.tok != _Lbrace {
   1771 		if p.tok == _Semi {
   1772 			semi.pos = p.pos()
   1773 			semi.lit = p.lit
   1774 			p.next()
   1775 		} else {
   1776 			p.want(_Semi)
   1777 		}
   1778 		if keyword == _For {
   1779 			if p.tok != _Semi {
   1780 				if p.tok == _Lbrace {
   1781 					p.syntax_error("expecting for loop condition")
   1782 					goto done
   1783 				}
   1784 				condStmt = p.simpleStmt(nil, false)
   1785 			}
   1786 			p.want(_Semi)
   1787 			if p.tok != _Lbrace {
   1788 				post = p.simpleStmt(nil, false)
   1789 				if a, _ := post.(*AssignStmt); a != nil && a.Op == Def {
   1790 					p.syntax_error_at(a.Pos(), "cannot declare in post statement of for loop")
   1791 				}
   1792 			}
   1793 		} else if p.tok != _Lbrace {
   1794 			condStmt = p.simpleStmt(nil, false)
   1795 		}
   1796 	} else {
   1797 		condStmt = init
   1798 		init = nil
   1799 	}
   1800 
   1801 done:
   1802 	// unpack condStmt
   1803 	switch s := condStmt.(type) {
   1804 	case nil:
   1805 		if keyword == _If && semi.pos.IsKnown() {
   1806 			if semi.lit != "semicolon" {
   1807 				p.syntax_error_at(semi.pos, fmt.Sprintf("unexpected %s, expecting { after if clause", semi.lit))
   1808 			} else {
   1809 				p.syntax_error_at(semi.pos, "missing condition in if statement")
   1810 			}
   1811 		}
   1812 	case *ExprStmt:
   1813 		cond = s.X
   1814 	default:
   1815 		p.syntax_error(fmt.Sprintf("%s used as value", String(s)))
   1816 	}
   1817 
   1818 	p.xnest = outer
   1819 	return
   1820 }
   1821 
   1822 func (p *parser) ifStmt() *IfStmt {
   1823 	if trace {
   1824 		defer p.trace("ifStmt")()
   1825 	}
   1826 
   1827 	s := new(IfStmt)
   1828 	s.pos = p.pos()
   1829 
   1830 	s.Init, s.Cond, _ = p.header(_If)
   1831 	s.Then = p.blockStmt("if clause")
   1832 
   1833 	if p.got(_Else) {
   1834 		switch p.tok {
   1835 		case _If:
   1836 			s.Else = p.ifStmt()
   1837 		case _Lbrace:
   1838 			s.Else = p.blockStmt("")
   1839 		default:
   1840 			p.syntax_error("else must be followed by if or statement block")
   1841 			p.advance(_Name, _Rbrace)
   1842 		}
   1843 	}
   1844 
   1845 	return s
   1846 }
   1847 
   1848 func (p *parser) switchStmt() *SwitchStmt {
   1849 	if trace {
   1850 		defer p.trace("switchStmt")()
   1851 	}
   1852 
   1853 	s := new(SwitchStmt)
   1854 	s.pos = p.pos()
   1855 
   1856 	s.Init, s.Tag, _ = p.header(_Switch)
   1857 
   1858 	if !p.got(_Lbrace) {
   1859 		p.syntax_error("missing { after switch clause")
   1860 		p.advance(_Case, _Default, _Rbrace)
   1861 	}
   1862 	for p.tok != _EOF && p.tok != _Rbrace {
   1863 		s.Body = append(s.Body, p.caseClause())
   1864 	}
   1865 	s.Rbrace = p.pos()
   1866 	p.want(_Rbrace)
   1867 
   1868 	return s
   1869 }
   1870 
   1871 func (p *parser) selectStmt() *SelectStmt {
   1872 	if trace {
   1873 		defer p.trace("selectStmt")()
   1874 	}
   1875 
   1876 	s := new(SelectStmt)
   1877 	s.pos = p.pos()
   1878 
   1879 	p.want(_Select)
   1880 	if !p.got(_Lbrace) {
   1881 		p.syntax_error("missing { after select clause")
   1882 		p.advance(_Case, _Default, _Rbrace)
   1883 	}
   1884 	for p.tok != _EOF && p.tok != _Rbrace {
   1885 		s.Body = append(s.Body, p.commClause())
   1886 	}
   1887 	s.Rbrace = p.pos()
   1888 	p.want(_Rbrace)
   1889 
   1890 	return s
   1891 }
   1892 
   1893 func (p *parser) caseClause() *CaseClause {
   1894 	if trace {
   1895 		defer p.trace("caseClause")()
   1896 	}
   1897 
   1898 	c := new(CaseClause)
   1899 	c.pos = p.pos()
   1900 
   1901 	switch p.tok {
   1902 	case _Case:
   1903 		p.next()
   1904 		c.Cases = p.exprList()
   1905 
   1906 	case _Default:
   1907 		p.next()
   1908 
   1909 	default:
   1910 		p.syntax_error("expecting case or default or }")
   1911 		p.advance(_Colon, _Case, _Default, _Rbrace)
   1912 	}
   1913 
   1914 	c.Colon = p.pos()
   1915 	p.want(_Colon)
   1916 	c.Body = p.stmtList()
   1917 
   1918 	return c
   1919 }
   1920 
   1921 func (p *parser) commClause() *CommClause {
   1922 	if trace {
   1923 		defer p.trace("commClause")()
   1924 	}
   1925 
   1926 	c := new(CommClause)
   1927 	c.pos = p.pos()
   1928 
   1929 	switch p.tok {
   1930 	case _Case:
   1931 		p.next()
   1932 		c.Comm = p.simpleStmt(nil, false)
   1933 
   1934 		// The syntax restricts the possible simple statements here to:
   1935 		//
   1936 		//     lhs <- x (send statement)
   1937 		//     <-x
   1938 		//     lhs = <-x
   1939 		//     lhs := <-x
   1940 		//
   1941 		// All these (and more) are recognized by simpleStmt and invalid
   1942 		// syntax trees are flagged later, during type checking.
   1943 		// TODO(gri) eventually may want to restrict valid syntax trees
   1944 		// here.
   1945 
   1946 	case _Default:
   1947 		p.next()
   1948 
   1949 	default:
   1950 		p.syntax_error("expecting case or default or }")
   1951 		p.advance(_Colon, _Case, _Default, _Rbrace)
   1952 	}
   1953 
   1954 	c.Colon = p.pos()
   1955 	p.want(_Colon)
   1956 	c.Body = p.stmtList()
   1957 
   1958 	return c
   1959 }
   1960 
   1961 // Statement =
   1962 // 	Declaration | LabeledStmt | SimpleStmt |
   1963 // 	GoStmt | ReturnStmt | BreakStmt | ContinueStmt | GotoStmt |
   1964 // 	FallthroughStmt | Block | IfStmt | SwitchStmt | SelectStmt | ForStmt |
   1965 // 	DeferStmt .
   1966 func (p *parser) stmtOrNil() Stmt {
   1967 	if trace {
   1968 		defer p.trace("stmt " + p.tok.String())()
   1969 	}
   1970 
   1971 	// Most statements (assignments) start with an identifier;
   1972 	// look for it first before doing anything more expensive.
   1973 	if p.tok == _Name {
   1974 		lhs := p.exprList()
   1975 		if label, ok := lhs.(*Name); ok && p.tok == _Colon {
   1976 			return p.labeledStmtOrNil(label)
   1977 		}
   1978 		return p.simpleStmt(lhs, false)
   1979 	}
   1980 
   1981 	switch p.tok {
   1982 	case _Lbrace:
   1983 		return p.blockStmt("")
   1984 
   1985 	case _Var:
   1986 		return p.declStmt(p.varDecl)
   1987 
   1988 	case _Const:
   1989 		return p.declStmt(p.constDecl)
   1990 
   1991 	case _Type:
   1992 		return p.declStmt(p.typeDecl)
   1993 
   1994 	case _Operator, _Star:
   1995 		switch p.op {
   1996 		case Add, Sub, Mul, And, Xor, Not:
   1997 			return p.simpleStmt(nil, false) // unary operators
   1998 		}
   1999 
   2000 	case _Literal, _Func, _Lparen, // operands
   2001 		_Lbrack, _Struct, _Map, _Chan, _Interface, // composite types
   2002 		_Arrow: // receive operator
   2003 		return p.simpleStmt(nil, false)
   2004 
   2005 	case _For:
   2006 		return p.forStmt()
   2007 
   2008 	case _Switch:
   2009 		return p.switchStmt()
   2010 
   2011 	case _Select:
   2012 		return p.selectStmt()
   2013 
   2014 	case _If:
   2015 		return p.ifStmt()
   2016 
   2017 	case _Fallthrough:
   2018 		s := new(BranchStmt)
   2019 		s.pos = p.pos()
   2020 		p.next()
   2021 		s.Tok = _Fallthrough
   2022 		return s
   2023 
   2024 	case _Break, _Continue:
   2025 		s := new(BranchStmt)
   2026 		s.pos = p.pos()
   2027 		s.Tok = p.tok
   2028 		p.next()
   2029 		if p.tok == _Name {
   2030 			s.Label = p.name()
   2031 		}
   2032 		return s
   2033 
   2034 	case _Go, _Defer:
   2035 		return p.callStmt()
   2036 
   2037 	case _Goto:
   2038 		s := new(BranchStmt)
   2039 		s.pos = p.pos()
   2040 		s.Tok = _Goto
   2041 		p.next()
   2042 		s.Label = p.name()
   2043 		return s
   2044 
   2045 	case _Return:
   2046 		s := new(ReturnStmt)
   2047 		s.pos = p.pos()
   2048 		p.next()
   2049 		if p.tok != _Semi && p.tok != _Rbrace {
   2050 			s.Results = p.exprList()
   2051 		}
   2052 		return s
   2053 
   2054 	case _Semi:
   2055 		s := new(EmptyStmt)
   2056 		s.pos = p.pos()
   2057 		return s
   2058 	}
   2059 
   2060 	return nil
   2061 }
   2062 
   2063 // StatementList = { Statement ";" } .
   2064 func (p *parser) stmtList() (l []Stmt) {
   2065 	if trace {
   2066 		defer p.trace("stmtList")()
   2067 	}
   2068 
   2069 	for p.tok != _EOF && p.tok != _Rbrace && p.tok != _Case && p.tok != _Default {
   2070 		s := p.stmtOrNil()
   2071 		if s == nil {
   2072 			break
   2073 		}
   2074 		l = append(l, s)
   2075 		// ";" is optional before "}"
   2076 		if !p.got(_Semi) && p.tok != _Rbrace {
   2077 			p.syntax_error("at end of statement")
   2078 			p.advance(_Semi, _Rbrace, _Case, _Default)
   2079 			p.got(_Semi) // avoid spurious empty statement
   2080 		}
   2081 	}
   2082 	return
   2083 }
   2084 
   2085 // Arguments = "(" [ ( ExpressionList | Type [ "," ExpressionList ] ) [ "..." ] [ "," ] ] ")" .
   2086 func (p *parser) argList() (list []Expr, hasDots bool) {
   2087 	if trace {
   2088 		defer p.trace("argList")()
   2089 	}
   2090 
   2091 	p.xnest++
   2092 	p.list(_Lparen, _Comma, _Rparen, func() bool {
   2093 		list = append(list, p.expr())
   2094 		hasDots = p.got(_DotDotDot)
   2095 		return hasDots
   2096 	})
   2097 	p.xnest--
   2098 
   2099 	return
   2100 }
   2101 
   2102 // ----------------------------------------------------------------------------
   2103 // Common productions
   2104 
   2105 func (p *parser) newName(value string) *Name {
   2106 	n := new(Name)
   2107 	n.pos = p.pos()
   2108 	n.Value = value
   2109 	return n
   2110 }
   2111 
   2112 func (p *parser) name() *Name {
   2113 	// no tracing to avoid overly verbose output
   2114 
   2115 	if p.tok == _Name {
   2116 		n := p.newName(p.lit)
   2117 		p.next()
   2118 		return n
   2119 	}
   2120 
   2121 	n := p.newName("_")
   2122 	p.syntax_error("expecting name")
   2123 	p.advance()
   2124 	return n
   2125 }
   2126 
   2127 // IdentifierList = identifier { "," identifier } .
   2128 // The first name must be provided.
   2129 func (p *parser) nameList(first *Name) []*Name {
   2130 	if trace {
   2131 		defer p.trace("nameList")()
   2132 	}
   2133 
   2134 	if debug && first == nil {
   2135 		panic("first name not provided")
   2136 	}
   2137 
   2138 	l := []*Name{first}
   2139 	for p.got(_Comma) {
   2140 		l = append(l, p.name())
   2141 	}
   2142 
   2143 	return l
   2144 }
   2145 
   2146 // The first name may be provided, or nil.
   2147 func (p *parser) qualifiedName(name *Name) Expr {
   2148 	if trace {
   2149 		defer p.trace("qualifiedName")()
   2150 	}
   2151 
   2152 	switch {
   2153 	case name != nil:
   2154 		// name is provided
   2155 	case p.tok == _Name:
   2156 		name = p.name()
   2157 	default:
   2158 		name = p.newName("_")
   2159 		p.syntax_error("expecting name")
   2160 		p.advance(_Dot, _Semi, _Rbrace)
   2161 	}
   2162 
   2163 	return p.dotname(name)
   2164 }
   2165 
   2166 // ExpressionList = Expression { "," Expression } .
   2167 func (p *parser) exprList() Expr {
   2168 	if trace {
   2169 		defer p.trace("exprList")()
   2170 	}
   2171 
   2172 	x := p.expr()
   2173 	if p.got(_Comma) {
   2174 		list := []Expr{x, p.expr()}
   2175 		for p.got(_Comma) {
   2176 			list = append(list, p.expr())
   2177 		}
   2178 		t := new(ListExpr)
   2179 		t.pos = x.Pos()
   2180 		t.ElemList = list
   2181 		x = t
   2182 	}
   2183 	return x
   2184 }
   2185 
   2186 // unparen removes all parentheses around an expression.
   2187 func unparen(x Expr) Expr {
   2188 	for {
   2189 		p, ok := x.(*ParenExpr)
   2190 		if !ok {
   2191 			break
   2192 		}
   2193 		x = p.X
   2194 	}
   2195 	return x
   2196 }
   2197