OSDN Git Service

e362e13a7b632f28e3b095db8e2856a56467a2f3
[pf3gnuchains/gcc-fork.git] / libgo / go / go / parser / parser.go
1 // Copyright 2009 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 parser implements a parser for Go source files. Input may be
6 // provided in a variety of forms (see the various Parse* functions); the
7 // output is an abstract syntax tree (AST) representing the Go source. The
8 // parser is invoked through one of the Parse* functions.
9 //
10 package parser
11
12 import (
13         "fmt"
14         "go/ast"
15         "go/scanner"
16         "go/token"
17         "strconv"
18         "strings"
19         "unicode"
20 )
21
22 // The parser structure holds the parser's internal state.
23 type parser struct {
24         file    *token.File
25         errors  scanner.ErrorList
26         scanner scanner.Scanner
27
28         // Tracing/debugging
29         mode   Mode // parsing mode
30         trace  bool // == (mode & Trace != 0)
31         indent uint // indentation used for tracing output
32
33         // Comments
34         comments    []*ast.CommentGroup
35         leadComment *ast.CommentGroup // last lead comment
36         lineComment *ast.CommentGroup // last line comment
37
38         // Next token
39         pos token.Pos   // token position
40         tok token.Token // one token look-ahead
41         lit string      // token literal
42
43         // Error recovery
44         // (used to limit the number of calls to syncXXX functions
45         // w/o making scanning progress - avoids potential endless
46         // loops across multiple parser functions during error recovery)
47         syncPos token.Pos // last synchronization position
48         syncCnt int       // number of calls to syncXXX without progress
49
50         // Non-syntactic parser control
51         exprLev int // < 0: in control clause, >= 0: in expression
52
53         // Ordinary identifier scopes
54         pkgScope   *ast.Scope        // pkgScope.Outer == nil
55         topScope   *ast.Scope        // top-most scope; may be pkgScope
56         unresolved []*ast.Ident      // unresolved identifiers
57         imports    []*ast.ImportSpec // list of imports
58
59         // Label scope
60         // (maintained by open/close LabelScope)
61         labelScope  *ast.Scope     // label scope for current function
62         targetStack [][]*ast.Ident // stack of unresolved labels
63 }
64
65 func (p *parser) init(fset *token.FileSet, filename string, src []byte, mode Mode) {
66         p.file = fset.AddFile(filename, fset.Base(), len(src))
67         var m scanner.Mode
68         if mode&ParseComments != 0 {
69                 m = scanner.ScanComments
70         }
71         eh := func(pos token.Position, msg string) { p.errors.Add(pos, msg) }
72         p.scanner.Init(p.file, src, eh, m)
73
74         p.mode = mode
75         p.trace = mode&Trace != 0 // for convenience (p.trace is used frequently)
76
77         p.next()
78
79         // set up the pkgScope here (as opposed to in parseFile) because
80         // there are other parser entry points (ParseExpr, etc.)
81         p.openScope()
82         p.pkgScope = p.topScope
83
84         // for the same reason, set up a label scope
85         p.openLabelScope()
86 }
87
88 // ----------------------------------------------------------------------------
89 // Scoping support
90
91 func (p *parser) openScope() {
92         p.topScope = ast.NewScope(p.topScope)
93 }
94
95 func (p *parser) closeScope() {
96         p.topScope = p.topScope.Outer
97 }
98
99 func (p *parser) openLabelScope() {
100         p.labelScope = ast.NewScope(p.labelScope)
101         p.targetStack = append(p.targetStack, nil)
102 }
103
104 func (p *parser) closeLabelScope() {
105         // resolve labels
106         n := len(p.targetStack) - 1
107         scope := p.labelScope
108         for _, ident := range p.targetStack[n] {
109                 ident.Obj = scope.Lookup(ident.Name)
110                 if ident.Obj == nil && p.mode&DeclarationErrors != 0 {
111                         p.error(ident.Pos(), fmt.Sprintf("label %s undefined", ident.Name))
112                 }
113         }
114         // pop label scope
115         p.targetStack = p.targetStack[0:n]
116         p.labelScope = p.labelScope.Outer
117 }
118
119 func (p *parser) declare(decl, data interface{}, scope *ast.Scope, kind ast.ObjKind, idents ...*ast.Ident) {
120         for _, ident := range idents {
121                 assert(ident.Obj == nil, "identifier already declared or resolved")
122                 obj := ast.NewObj(kind, ident.Name)
123                 // remember the corresponding declaration for redeclaration
124                 // errors and global variable resolution/typechecking phase
125                 obj.Decl = decl
126                 obj.Data = data
127                 ident.Obj = obj
128                 if ident.Name != "_" {
129                         if alt := scope.Insert(obj); alt != nil && p.mode&DeclarationErrors != 0 {
130                                 prevDecl := ""
131                                 if pos := alt.Pos(); pos.IsValid() {
132                                         prevDecl = fmt.Sprintf("\n\tprevious declaration at %s", p.file.Position(pos))
133                                 }
134                                 p.error(ident.Pos(), fmt.Sprintf("%s redeclared in this block%s", ident.Name, prevDecl))
135                         }
136                 }
137         }
138 }
139
140 func (p *parser) shortVarDecl(decl *ast.AssignStmt, list []ast.Expr) {
141         // Go spec: A short variable declaration may redeclare variables
142         // provided they were originally declared in the same block with
143         // the same type, and at least one of the non-blank variables is new.
144         n := 0 // number of new variables
145         for _, x := range list {
146                 if ident, isIdent := x.(*ast.Ident); isIdent {
147                         assert(ident.Obj == nil, "identifier already declared or resolved")
148                         obj := ast.NewObj(ast.Var, ident.Name)
149                         // remember corresponding assignment for other tools
150                         obj.Decl = decl
151                         ident.Obj = obj
152                         if ident.Name != "_" {
153                                 if alt := p.topScope.Insert(obj); alt != nil {
154                                         ident.Obj = alt // redeclaration
155                                 } else {
156                                         n++ // new declaration
157                                 }
158                         }
159                 } else {
160                         p.errorExpected(x.Pos(), "identifier")
161                 }
162         }
163         if n == 0 && p.mode&DeclarationErrors != 0 {
164                 p.error(list[0].Pos(), "no new variables on left side of :=")
165         }
166 }
167
168 // The unresolved object is a sentinel to mark identifiers that have been added
169 // to the list of unresolved identifiers. The sentinel is only used for verifying
170 // internal consistency.
171 var unresolved = new(ast.Object)
172
173 func (p *parser) resolve(x ast.Expr) {
174         // nothing to do if x is not an identifier or the blank identifier
175         ident, _ := x.(*ast.Ident)
176         if ident == nil {
177                 return
178         }
179         assert(ident.Obj == nil, "identifier already declared or resolved")
180         if ident.Name == "_" {
181                 return
182         }
183         // try to resolve the identifier
184         for s := p.topScope; s != nil; s = s.Outer {
185                 if obj := s.Lookup(ident.Name); obj != nil {
186                         ident.Obj = obj
187                         return
188                 }
189         }
190         // all local scopes are known, so any unresolved identifier
191         // must be found either in the file scope, package scope
192         // (perhaps in another file), or universe scope --- collect
193         // them so that they can be resolved later
194         ident.Obj = unresolved
195         p.unresolved = append(p.unresolved, ident)
196 }
197
198 // ----------------------------------------------------------------------------
199 // Parsing support
200
201 func (p *parser) printTrace(a ...interface{}) {
202         const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " +
203                 ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "
204         const n = uint(len(dots))
205         pos := p.file.Position(p.pos)
206         fmt.Printf("%5d:%3d: ", pos.Line, pos.Column)
207         i := 2 * p.indent
208         for ; i > n; i -= n {
209                 fmt.Print(dots)
210         }
211         fmt.Print(dots[0:i])
212         fmt.Println(a...)
213 }
214
215 func trace(p *parser, msg string) *parser {
216         p.printTrace(msg, "(")
217         p.indent++
218         return p
219 }
220
221 // Usage pattern: defer un(trace(p, "..."));
222 func un(p *parser) {
223         p.indent--
224         p.printTrace(")")
225 }
226
227 // Advance to the next token.
228 func (p *parser) next0() {
229         // Because of one-token look-ahead, print the previous token
230         // when tracing as it provides a more readable output. The
231         // very first token (!p.pos.IsValid()) is not initialized
232         // (it is token.ILLEGAL), so don't print it .
233         if p.trace && p.pos.IsValid() {
234                 s := p.tok.String()
235                 switch {
236                 case p.tok.IsLiteral():
237                         p.printTrace(s, p.lit)
238                 case p.tok.IsOperator(), p.tok.IsKeyword():
239                         p.printTrace("\"" + s + "\"")
240                 default:
241                         p.printTrace(s)
242                 }
243         }
244
245         p.pos, p.tok, p.lit = p.scanner.Scan()
246 }
247
248 // Consume a comment and return it and the line on which it ends.
249 func (p *parser) consumeComment() (comment *ast.Comment, endline int) {
250         // /*-style comments may end on a different line than where they start.
251         // Scan the comment for '\n' chars and adjust endline accordingly.
252         endline = p.file.Line(p.pos)
253         if p.lit[1] == '*' {
254                 // don't use range here - no need to decode Unicode code points
255                 for i := 0; i < len(p.lit); i++ {
256                         if p.lit[i] == '\n' {
257                                 endline++
258                         }
259                 }
260         }
261
262         comment = &ast.Comment{Slash: p.pos, Text: p.lit}
263         p.next0()
264
265         return
266 }
267
268 // Consume a group of adjacent comments, add it to the parser's
269 // comments list, and return it together with the line at which
270 // the last comment in the group ends. An empty line or non-comment
271 // token terminates a comment group.
272 //
273 func (p *parser) consumeCommentGroup() (comments *ast.CommentGroup, endline int) {
274         var list []*ast.Comment
275         endline = p.file.Line(p.pos)
276         for p.tok == token.COMMENT && endline+1 >= p.file.Line(p.pos) {
277                 var comment *ast.Comment
278                 comment, endline = p.consumeComment()
279                 list = append(list, comment)
280         }
281
282         // add comment group to the comments list
283         comments = &ast.CommentGroup{List: list}
284         p.comments = append(p.comments, comments)
285
286         return
287 }
288
289 // Advance to the next non-comment token. In the process, collect
290 // any comment groups encountered, and remember the last lead and
291 // and line comments.
292 //
293 // A lead comment is a comment group that starts and ends in a
294 // line without any other tokens and that is followed by a non-comment
295 // token on the line immediately after the comment group.
296 //
297 // A line comment is a comment group that follows a non-comment
298 // token on the same line, and that has no tokens after it on the line
299 // where it ends.
300 //
301 // Lead and line comments may be considered documentation that is
302 // stored in the AST.
303 //
304 func (p *parser) next() {
305         p.leadComment = nil
306         p.lineComment = nil
307         line := p.file.Line(p.pos) // current line
308         p.next0()
309
310         if p.tok == token.COMMENT {
311                 var comment *ast.CommentGroup
312                 var endline int
313
314                 if p.file.Line(p.pos) == line {
315                         // The comment is on same line as the previous token; it
316                         // cannot be a lead comment but may be a line comment.
317                         comment, endline = p.consumeCommentGroup()
318                         if p.file.Line(p.pos) != endline {
319                                 // The next token is on a different line, thus
320                                 // the last comment group is a line comment.
321                                 p.lineComment = comment
322                         }
323                 }
324
325                 // consume successor comments, if any
326                 endline = -1
327                 for p.tok == token.COMMENT {
328                         comment, endline = p.consumeCommentGroup()
329                 }
330
331                 if endline+1 == p.file.Line(p.pos) {
332                         // The next token is following on the line immediately after the
333                         // comment group, thus the last comment group is a lead comment.
334                         p.leadComment = comment
335                 }
336         }
337 }
338
339 func (p *parser) error(pos token.Pos, msg string) {
340         p.errors.Add(p.file.Position(pos), msg)
341 }
342
343 func (p *parser) errorExpected(pos token.Pos, msg string) {
344         msg = "expected " + msg
345         if pos == p.pos {
346                 // the error happened at the current position;
347                 // make the error message more specific
348                 if p.tok == token.SEMICOLON && p.lit == "\n" {
349                         msg += ", found newline"
350                 } else {
351                         msg += ", found '" + p.tok.String() + "'"
352                         if p.tok.IsLiteral() {
353                                 msg += " " + p.lit
354                         }
355                 }
356         }
357         p.error(pos, msg)
358 }
359
360 func (p *parser) expect(tok token.Token) token.Pos {
361         pos := p.pos
362         if p.tok != tok {
363                 p.errorExpected(pos, "'"+tok.String()+"'")
364         }
365         p.next() // make progress
366         return pos
367 }
368
369 // expectClosing is like expect but provides a better error message
370 // for the common case of a missing comma before a newline.
371 //
372 func (p *parser) expectClosing(tok token.Token, context string) token.Pos {
373         if p.tok != tok && p.tok == token.SEMICOLON && p.lit == "\n" {
374                 p.error(p.pos, "missing ',' before newline in "+context)
375                 p.next()
376         }
377         return p.expect(tok)
378 }
379
380 func (p *parser) expectSemi() {
381         // semicolon is optional before a closing ')' or '}'
382         if p.tok != token.RPAREN && p.tok != token.RBRACE {
383                 if p.tok == token.SEMICOLON {
384                         p.next()
385                 } else {
386                         p.errorExpected(p.pos, "';'")
387                         syncStmt(p)
388                 }
389         }
390 }
391
392 func (p *parser) atComma(context string) bool {
393         if p.tok == token.COMMA {
394                 return true
395         }
396         if p.tok == token.SEMICOLON && p.lit == "\n" {
397                 p.error(p.pos, "missing ',' before newline in "+context)
398                 return true // "insert" the comma and continue
399
400         }
401         return false
402 }
403
404 func assert(cond bool, msg string) {
405         if !cond {
406                 panic("go/parser internal error: " + msg)
407         }
408 }
409
410 // syncStmt advances to the next statement.
411 // Used for synchronization after an error.
412 //
413 func syncStmt(p *parser) {
414         for {
415                 switch p.tok {
416                 case token.BREAK, token.CONST, token.CONTINUE, token.DEFER,
417                         token.FALLTHROUGH, token.FOR, token.GO, token.GOTO,
418                         token.IF, token.RETURN, token.SELECT, token.SWITCH,
419                         token.TYPE, token.VAR:
420                         // Return only if parser made some progress since last
421                         // sync or if it has not reached 10 sync calls without
422                         // progress. Otherwise consume at least one token to
423                         // avoid an endless parser loop (it is possible that
424                         // both parseOperand and parseStmt call syncStmt and
425                         // correctly do not advance, thus the need for the
426                         // invocation limit p.syncCnt).
427                         if p.pos == p.syncPos && p.syncCnt < 10 {
428                                 p.syncCnt++
429                                 return
430                         }
431                         if p.pos > p.syncPos {
432                                 p.syncPos = p.pos
433                                 p.syncCnt = 0
434                                 return
435                         }
436                         // Reaching here indicates a parser bug, likely an
437                         // incorrect token list in this function, but it only
438                         // leads to skipping of possibly correct code if a
439                         // previous error is present, and thus is preferred
440                         // over a non-terminating parse.
441                 case token.EOF:
442                         return
443                 }
444                 p.next()
445         }
446 }
447
448 // syncDecl advances to the next declaration.
449 // Used for synchronization after an error.
450 //
451 func syncDecl(p *parser) {
452         for {
453                 switch p.tok {
454                 case token.CONST, token.TYPE, token.VAR:
455                         // see comments in syncStmt
456                         if p.pos == p.syncPos && p.syncCnt < 10 {
457                                 p.syncCnt++
458                                 return
459                         }
460                         if p.pos > p.syncPos {
461                                 p.syncPos = p.pos
462                                 p.syncCnt = 0
463                                 return
464                         }
465                 case token.EOF:
466                         return
467                 }
468                 p.next()
469         }
470 }
471
472 // ----------------------------------------------------------------------------
473 // Identifiers
474
475 func (p *parser) parseIdent() *ast.Ident {
476         pos := p.pos
477         name := "_"
478         if p.tok == token.IDENT {
479                 name = p.lit
480                 p.next()
481         } else {
482                 p.expect(token.IDENT) // use expect() error handling
483         }
484         return &ast.Ident{NamePos: pos, Name: name}
485 }
486
487 func (p *parser) parseIdentList() (list []*ast.Ident) {
488         if p.trace {
489                 defer un(trace(p, "IdentList"))
490         }
491
492         list = append(list, p.parseIdent())
493         for p.tok == token.COMMA {
494                 p.next()
495                 list = append(list, p.parseIdent())
496         }
497
498         return
499 }
500
501 // ----------------------------------------------------------------------------
502 // Common productions
503
504 // If lhs is set, result list elements which are identifiers are not resolved.
505 func (p *parser) parseExprList(lhs bool) (list []ast.Expr) {
506         if p.trace {
507                 defer un(trace(p, "ExpressionList"))
508         }
509
510         list = append(list, p.checkExpr(p.parseExpr(lhs)))
511         for p.tok == token.COMMA {
512                 p.next()
513                 list = append(list, p.checkExpr(p.parseExpr(lhs)))
514         }
515
516         return
517 }
518
519 func (p *parser) parseLhsList() []ast.Expr {
520         list := p.parseExprList(true)
521         switch p.tok {
522         case token.DEFINE:
523                 // lhs of a short variable declaration
524                 // but doesn't enter scope until later:
525                 // caller must call p.shortVarDecl(p.makeIdentList(list))
526                 // at appropriate time.
527         case token.COLON:
528                 // lhs of a label declaration or a communication clause of a select
529                 // statement (parseLhsList is not called when parsing the case clause
530                 // of a switch statement):
531                 // - labels are declared by the caller of parseLhsList
532                 // - for communication clauses, if there is a stand-alone identifier
533                 //   followed by a colon, we have a syntax error; there is no need
534                 //   to resolve the identifier in that case
535         default:
536                 // identifiers must be declared elsewhere
537                 for _, x := range list {
538                         p.resolve(x)
539                 }
540         }
541         return list
542 }
543
544 func (p *parser) parseRhsList() []ast.Expr {
545         return p.parseExprList(false)
546 }
547
548 // ----------------------------------------------------------------------------
549 // Types
550
551 func (p *parser) parseType() ast.Expr {
552         if p.trace {
553                 defer un(trace(p, "Type"))
554         }
555
556         typ := p.tryType()
557
558         if typ == nil {
559                 pos := p.pos
560                 p.errorExpected(pos, "type")
561                 p.next() // make progress
562                 return &ast.BadExpr{From: pos, To: p.pos}
563         }
564
565         return typ
566 }
567
568 // If the result is an identifier, it is not resolved.
569 func (p *parser) parseTypeName() ast.Expr {
570         if p.trace {
571                 defer un(trace(p, "TypeName"))
572         }
573
574         ident := p.parseIdent()
575         // don't resolve ident yet - it may be a parameter or field name
576
577         if p.tok == token.PERIOD {
578                 // ident is a package name
579                 p.next()
580                 p.resolve(ident)
581                 sel := p.parseIdent()
582                 return &ast.SelectorExpr{X: ident, Sel: sel}
583         }
584
585         return ident
586 }
587
588 func (p *parser) parseArrayType(ellipsisOk bool) ast.Expr {
589         if p.trace {
590                 defer un(trace(p, "ArrayType"))
591         }
592
593         lbrack := p.expect(token.LBRACK)
594         var len ast.Expr
595         if ellipsisOk && p.tok == token.ELLIPSIS {
596                 len = &ast.Ellipsis{Ellipsis: p.pos}
597                 p.next()
598         } else if p.tok != token.RBRACK {
599                 len = p.parseRhs()
600         }
601         p.expect(token.RBRACK)
602         elt := p.parseType()
603
604         return &ast.ArrayType{Lbrack: lbrack, Len: len, Elt: elt}
605 }
606
607 func (p *parser) makeIdentList(list []ast.Expr) []*ast.Ident {
608         idents := make([]*ast.Ident, len(list))
609         for i, x := range list {
610                 ident, isIdent := x.(*ast.Ident)
611                 if !isIdent {
612                         if _, isBad := x.(*ast.BadExpr); !isBad {
613                                 // only report error if it's a new one
614                                 p.errorExpected(x.Pos(), "identifier")
615                         }
616                         ident = &ast.Ident{NamePos: x.Pos(), Name: "_"}
617                 }
618                 idents[i] = ident
619         }
620         return idents
621 }
622
623 func (p *parser) parseFieldDecl(scope *ast.Scope) *ast.Field {
624         if p.trace {
625                 defer un(trace(p, "FieldDecl"))
626         }
627
628         doc := p.leadComment
629
630         // fields
631         list, typ := p.parseVarList(false)
632
633         // optional tag
634         var tag *ast.BasicLit
635         if p.tok == token.STRING {
636                 tag = &ast.BasicLit{ValuePos: p.pos, Kind: p.tok, Value: p.lit}
637                 p.next()
638         }
639
640         // analyze case
641         var idents []*ast.Ident
642         if typ != nil {
643                 // IdentifierList Type
644                 idents = p.makeIdentList(list)
645         } else {
646                 // ["*"] TypeName (AnonymousField)
647                 typ = list[0] // we always have at least one element
648                 p.resolve(typ)
649                 if n := len(list); n > 1 || !isTypeName(deref(typ)) {
650                         pos := typ.Pos()
651                         p.errorExpected(pos, "anonymous field")
652                         typ = &ast.BadExpr{From: pos, To: list[n-1].End()}
653                 }
654         }
655
656         p.expectSemi() // call before accessing p.linecomment
657
658         field := &ast.Field{Doc: doc, Names: idents, Type: typ, Tag: tag, Comment: p.lineComment}
659         p.declare(field, nil, scope, ast.Var, idents...)
660
661         return field
662 }
663
664 func (p *parser) parseStructType() *ast.StructType {
665         if p.trace {
666                 defer un(trace(p, "StructType"))
667         }
668
669         pos := p.expect(token.STRUCT)
670         lbrace := p.expect(token.LBRACE)
671         scope := ast.NewScope(nil) // struct scope
672         var list []*ast.Field
673         for p.tok == token.IDENT || p.tok == token.MUL || p.tok == token.LPAREN {
674                 // a field declaration cannot start with a '(' but we accept
675                 // it here for more robust parsing and better error messages
676                 // (parseFieldDecl will check and complain if necessary)
677                 list = append(list, p.parseFieldDecl(scope))
678         }
679         rbrace := p.expect(token.RBRACE)
680
681         return &ast.StructType{
682                 Struct: pos,
683                 Fields: &ast.FieldList{
684                         Opening: lbrace,
685                         List:    list,
686                         Closing: rbrace,
687                 },
688         }
689 }
690
691 func (p *parser) parsePointerType() *ast.StarExpr {
692         if p.trace {
693                 defer un(trace(p, "PointerType"))
694         }
695
696         star := p.expect(token.MUL)
697         base := p.parseType()
698
699         return &ast.StarExpr{Star: star, X: base}
700 }
701
702 func (p *parser) tryVarType(isParam bool) ast.Expr {
703         if isParam && p.tok == token.ELLIPSIS {
704                 pos := p.pos
705                 p.next()
706                 typ := p.tryIdentOrType(isParam) // don't use parseType so we can provide better error message
707                 if typ == nil {
708                         p.error(pos, "'...' parameter is missing type")
709                         typ = &ast.BadExpr{From: pos, To: p.pos}
710                 }
711                 return &ast.Ellipsis{Ellipsis: pos, Elt: typ}
712         }
713         return p.tryIdentOrType(false)
714 }
715
716 func (p *parser) parseVarType(isParam bool) ast.Expr {
717         typ := p.tryVarType(isParam)
718         if typ == nil {
719                 pos := p.pos
720                 p.errorExpected(pos, "type")
721                 p.next() // make progress
722                 typ = &ast.BadExpr{From: pos, To: p.pos}
723         }
724         return typ
725 }
726
727 func (p *parser) parseVarList(isParam bool) (list []ast.Expr, typ ast.Expr) {
728         if p.trace {
729                 defer un(trace(p, "VarList"))
730         }
731
732         // a list of identifiers looks like a list of type names
733         //
734         // parse/tryVarType accepts any type (including parenthesized
735         // ones) even though the syntax does not permit them here: we
736         // accept them all for more robust parsing and complain later
737         for typ := p.parseVarType(isParam); typ != nil; {
738                 list = append(list, typ)
739                 if p.tok != token.COMMA {
740                         break
741                 }
742                 p.next()
743                 typ = p.tryVarType(isParam) // maybe nil as in: func f(int,) {}
744         }
745
746         // if we had a list of identifiers, it must be followed by a type
747         if typ = p.tryVarType(isParam); typ != nil {
748                 p.resolve(typ)
749         }
750
751         return
752 }
753
754 func (p *parser) parseParameterList(scope *ast.Scope, ellipsisOk bool) (params []*ast.Field) {
755         if p.trace {
756                 defer un(trace(p, "ParameterList"))
757         }
758
759         list, typ := p.parseVarList(ellipsisOk)
760         if typ != nil {
761                 // IdentifierList Type
762                 idents := p.makeIdentList(list)
763                 field := &ast.Field{Names: idents, Type: typ}
764                 params = append(params, field)
765                 // Go spec: The scope of an identifier denoting a function
766                 // parameter or result variable is the function body.
767                 p.declare(field, nil, scope, ast.Var, idents...)
768                 if p.tok == token.COMMA {
769                         p.next()
770                 }
771
772                 for p.tok != token.RPAREN && p.tok != token.EOF {
773                         idents := p.parseIdentList()
774                         typ := p.parseVarType(ellipsisOk)
775                         field := &ast.Field{Names: idents, Type: typ}
776                         params = append(params, field)
777                         // Go spec: The scope of an identifier denoting a function
778                         // parameter or result variable is the function body.
779                         p.declare(field, nil, scope, ast.Var, idents...)
780                         if !p.atComma("parameter list") {
781                                 break
782                         }
783                         p.next()
784                 }
785
786         } else {
787                 // Type { "," Type } (anonymous parameters)
788                 params = make([]*ast.Field, len(list))
789                 for i, x := range list {
790                         p.resolve(x)
791                         params[i] = &ast.Field{Type: x}
792                 }
793         }
794
795         return
796 }
797
798 func (p *parser) parseParameters(scope *ast.Scope, ellipsisOk bool) *ast.FieldList {
799         if p.trace {
800                 defer un(trace(p, "Parameters"))
801         }
802
803         var params []*ast.Field
804         lparen := p.expect(token.LPAREN)
805         if p.tok != token.RPAREN {
806                 params = p.parseParameterList(scope, ellipsisOk)
807         }
808         rparen := p.expect(token.RPAREN)
809
810         return &ast.FieldList{Opening: lparen, List: params, Closing: rparen}
811 }
812
813 func (p *parser) parseResult(scope *ast.Scope) *ast.FieldList {
814         if p.trace {
815                 defer un(trace(p, "Result"))
816         }
817
818         if p.tok == token.LPAREN {
819                 return p.parseParameters(scope, false)
820         }
821
822         typ := p.tryType()
823         if typ != nil {
824                 list := make([]*ast.Field, 1)
825                 list[0] = &ast.Field{Type: typ}
826                 return &ast.FieldList{List: list}
827         }
828
829         return nil
830 }
831
832 func (p *parser) parseSignature(scope *ast.Scope) (params, results *ast.FieldList) {
833         if p.trace {
834                 defer un(trace(p, "Signature"))
835         }
836
837         params = p.parseParameters(scope, true)
838         results = p.parseResult(scope)
839
840         return
841 }
842
843 func (p *parser) parseFuncType() (*ast.FuncType, *ast.Scope) {
844         if p.trace {
845                 defer un(trace(p, "FuncType"))
846         }
847
848         pos := p.expect(token.FUNC)
849         scope := ast.NewScope(p.topScope) // function scope
850         params, results := p.parseSignature(scope)
851
852         return &ast.FuncType{Func: pos, Params: params, Results: results}, scope
853 }
854
855 func (p *parser) parseMethodSpec(scope *ast.Scope) *ast.Field {
856         if p.trace {
857                 defer un(trace(p, "MethodSpec"))
858         }
859
860         doc := p.leadComment
861         var idents []*ast.Ident
862         var typ ast.Expr
863         x := p.parseTypeName()
864         if ident, isIdent := x.(*ast.Ident); isIdent && p.tok == token.LPAREN {
865                 // method
866                 idents = []*ast.Ident{ident}
867                 scope := ast.NewScope(nil) // method scope
868                 params, results := p.parseSignature(scope)
869                 typ = &ast.FuncType{Func: token.NoPos, Params: params, Results: results}
870         } else {
871                 // embedded interface
872                 typ = x
873                 p.resolve(typ)
874         }
875         p.expectSemi() // call before accessing p.linecomment
876
877         spec := &ast.Field{Doc: doc, Names: idents, Type: typ, Comment: p.lineComment}
878         p.declare(spec, nil, scope, ast.Fun, idents...)
879
880         return spec
881 }
882
883 func (p *parser) parseInterfaceType() *ast.InterfaceType {
884         if p.trace {
885                 defer un(trace(p, "InterfaceType"))
886         }
887
888         pos := p.expect(token.INTERFACE)
889         lbrace := p.expect(token.LBRACE)
890         scope := ast.NewScope(nil) // interface scope
891         var list []*ast.Field
892         for p.tok == token.IDENT {
893                 list = append(list, p.parseMethodSpec(scope))
894         }
895         rbrace := p.expect(token.RBRACE)
896
897         return &ast.InterfaceType{
898                 Interface: pos,
899                 Methods: &ast.FieldList{
900                         Opening: lbrace,
901                         List:    list,
902                         Closing: rbrace,
903                 },
904         }
905 }
906
907 func (p *parser) parseMapType() *ast.MapType {
908         if p.trace {
909                 defer un(trace(p, "MapType"))
910         }
911
912         pos := p.expect(token.MAP)
913         p.expect(token.LBRACK)
914         key := p.parseType()
915         p.expect(token.RBRACK)
916         value := p.parseType()
917
918         return &ast.MapType{Map: pos, Key: key, Value: value}
919 }
920
921 func (p *parser) parseChanType() *ast.ChanType {
922         if p.trace {
923                 defer un(trace(p, "ChanType"))
924         }
925
926         pos := p.pos
927         dir := ast.SEND | ast.RECV
928         if p.tok == token.CHAN {
929                 p.next()
930                 if p.tok == token.ARROW {
931                         p.next()
932                         dir = ast.SEND
933                 }
934         } else {
935                 p.expect(token.ARROW)
936                 p.expect(token.CHAN)
937                 dir = ast.RECV
938         }
939         value := p.parseType()
940
941         return &ast.ChanType{Begin: pos, Dir: dir, Value: value}
942 }
943
944 // If the result is an identifier, it is not resolved.
945 func (p *parser) tryIdentOrType(ellipsisOk bool) ast.Expr {
946         switch p.tok {
947         case token.IDENT:
948                 return p.parseTypeName()
949         case token.LBRACK:
950                 return p.parseArrayType(ellipsisOk)
951         case token.STRUCT:
952                 return p.parseStructType()
953         case token.MUL:
954                 return p.parsePointerType()
955         case token.FUNC:
956                 typ, _ := p.parseFuncType()
957                 return typ
958         case token.INTERFACE:
959                 return p.parseInterfaceType()
960         case token.MAP:
961                 return p.parseMapType()
962         case token.CHAN, token.ARROW:
963                 return p.parseChanType()
964         case token.LPAREN:
965                 lparen := p.pos
966                 p.next()
967                 typ := p.parseType()
968                 rparen := p.expect(token.RPAREN)
969                 return &ast.ParenExpr{Lparen: lparen, X: typ, Rparen: rparen}
970         }
971
972         // no type found
973         return nil
974 }
975
976 func (p *parser) tryType() ast.Expr {
977         typ := p.tryIdentOrType(false)
978         if typ != nil {
979                 p.resolve(typ)
980         }
981         return typ
982 }
983
984 // ----------------------------------------------------------------------------
985 // Blocks
986
987 func (p *parser) parseStmtList() (list []ast.Stmt) {
988         if p.trace {
989                 defer un(trace(p, "StatementList"))
990         }
991
992         for p.tok != token.CASE && p.tok != token.DEFAULT && p.tok != token.RBRACE && p.tok != token.EOF {
993                 list = append(list, p.parseStmt())
994         }
995
996         return
997 }
998
999 func (p *parser) parseBody(scope *ast.Scope) *ast.BlockStmt {
1000         if p.trace {
1001                 defer un(trace(p, "Body"))
1002         }
1003
1004         lbrace := p.expect(token.LBRACE)
1005         p.topScope = scope // open function scope
1006         p.openLabelScope()
1007         list := p.parseStmtList()
1008         p.closeLabelScope()
1009         p.closeScope()
1010         rbrace := p.expect(token.RBRACE)
1011
1012         return &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace}
1013 }
1014
1015 func (p *parser) parseBlockStmt() *ast.BlockStmt {
1016         if p.trace {
1017                 defer un(trace(p, "BlockStmt"))
1018         }
1019
1020         lbrace := p.expect(token.LBRACE)
1021         p.openScope()
1022         list := p.parseStmtList()
1023         p.closeScope()
1024         rbrace := p.expect(token.RBRACE)
1025
1026         return &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace}
1027 }
1028
1029 // ----------------------------------------------------------------------------
1030 // Expressions
1031
1032 func (p *parser) parseFuncTypeOrLit() ast.Expr {
1033         if p.trace {
1034                 defer un(trace(p, "FuncTypeOrLit"))
1035         }
1036
1037         typ, scope := p.parseFuncType()
1038         if p.tok != token.LBRACE {
1039                 // function type only
1040                 return typ
1041         }
1042
1043         p.exprLev++
1044         body := p.parseBody(scope)
1045         p.exprLev--
1046
1047         return &ast.FuncLit{Type: typ, Body: body}
1048 }
1049
1050 // parseOperand may return an expression or a raw type (incl. array
1051 // types of the form [...]T. Callers must verify the result.
1052 // If lhs is set and the result is an identifier, it is not resolved.
1053 //
1054 func (p *parser) parseOperand(lhs bool) ast.Expr {
1055         if p.trace {
1056                 defer un(trace(p, "Operand"))
1057         }
1058
1059         switch p.tok {
1060         case token.IDENT:
1061                 x := p.parseIdent()
1062                 if !lhs {
1063                         p.resolve(x)
1064                 }
1065                 return x
1066
1067         case token.INT, token.FLOAT, token.IMAG, token.CHAR, token.STRING:
1068                 x := &ast.BasicLit{ValuePos: p.pos, Kind: p.tok, Value: p.lit}
1069                 p.next()
1070                 return x
1071
1072         case token.LPAREN:
1073                 lparen := p.pos
1074                 p.next()
1075                 p.exprLev++
1076                 x := p.parseRhsOrType() // types may be parenthesized: (some type)
1077                 p.exprLev--
1078                 rparen := p.expect(token.RPAREN)
1079                 return &ast.ParenExpr{Lparen: lparen, X: x, Rparen: rparen}
1080
1081         case token.FUNC:
1082                 return p.parseFuncTypeOrLit()
1083         }
1084
1085         if typ := p.tryIdentOrType(true); typ != nil {
1086                 // could be type for composite literal or conversion
1087                 _, isIdent := typ.(*ast.Ident)
1088                 assert(!isIdent, "type cannot be identifier")
1089                 return typ
1090         }
1091
1092         // we have an error
1093         pos := p.pos
1094         p.errorExpected(pos, "operand")
1095         syncStmt(p)
1096         return &ast.BadExpr{From: pos, To: p.pos}
1097 }
1098
1099 func (p *parser) parseSelector(x ast.Expr) ast.Expr {
1100         if p.trace {
1101                 defer un(trace(p, "Selector"))
1102         }
1103
1104         sel := p.parseIdent()
1105
1106         return &ast.SelectorExpr{X: x, Sel: sel}
1107 }
1108
1109 func (p *parser) parseTypeAssertion(x ast.Expr) ast.Expr {
1110         if p.trace {
1111                 defer un(trace(p, "TypeAssertion"))
1112         }
1113
1114         p.expect(token.LPAREN)
1115         var typ ast.Expr
1116         if p.tok == token.TYPE {
1117                 // type switch: typ == nil
1118                 p.next()
1119         } else {
1120                 typ = p.parseType()
1121         }
1122         p.expect(token.RPAREN)
1123
1124         return &ast.TypeAssertExpr{X: x, Type: typ}
1125 }
1126
1127 func (p *parser) parseIndexOrSlice(x ast.Expr) ast.Expr {
1128         if p.trace {
1129                 defer un(trace(p, "IndexOrSlice"))
1130         }
1131
1132         lbrack := p.expect(token.LBRACK)
1133         p.exprLev++
1134         var low, high ast.Expr
1135         isSlice := false
1136         if p.tok != token.COLON {
1137                 low = p.parseRhs()
1138         }
1139         if p.tok == token.COLON {
1140                 isSlice = true
1141                 p.next()
1142                 if p.tok != token.RBRACK {
1143                         high = p.parseRhs()
1144                 }
1145         }
1146         p.exprLev--
1147         rbrack := p.expect(token.RBRACK)
1148
1149         if isSlice {
1150                 return &ast.SliceExpr{X: x, Lbrack: lbrack, Low: low, High: high, Rbrack: rbrack}
1151         }
1152         return &ast.IndexExpr{X: x, Lbrack: lbrack, Index: low, Rbrack: rbrack}
1153 }
1154
1155 func (p *parser) parseCallOrConversion(fun ast.Expr) *ast.CallExpr {
1156         if p.trace {
1157                 defer un(trace(p, "CallOrConversion"))
1158         }
1159
1160         lparen := p.expect(token.LPAREN)
1161         p.exprLev++
1162         var list []ast.Expr
1163         var ellipsis token.Pos
1164         for p.tok != token.RPAREN && p.tok != token.EOF && !ellipsis.IsValid() {
1165                 list = append(list, p.parseRhsOrType()) // builtins may expect a type: make(some type, ...)
1166                 if p.tok == token.ELLIPSIS {
1167                         ellipsis = p.pos
1168                         p.next()
1169                 }
1170                 if !p.atComma("argument list") {
1171                         break
1172                 }
1173                 p.next()
1174         }
1175         p.exprLev--
1176         rparen := p.expectClosing(token.RPAREN, "argument list")
1177
1178         return &ast.CallExpr{Fun: fun, Lparen: lparen, Args: list, Ellipsis: ellipsis, Rparen: rparen}
1179 }
1180
1181 func (p *parser) parseElement(keyOk bool) ast.Expr {
1182         if p.trace {
1183                 defer un(trace(p, "Element"))
1184         }
1185
1186         if p.tok == token.LBRACE {
1187                 return p.parseLiteralValue(nil)
1188         }
1189
1190         x := p.checkExpr(p.parseExpr(keyOk)) // don't resolve if map key
1191         if keyOk {
1192                 if p.tok == token.COLON {
1193                         colon := p.pos
1194                         p.next()
1195                         return &ast.KeyValueExpr{Key: x, Colon: colon, Value: p.parseElement(false)}
1196                 }
1197                 p.resolve(x) // not a map key
1198         }
1199
1200         return x
1201 }
1202
1203 func (p *parser) parseElementList() (list []ast.Expr) {
1204         if p.trace {
1205                 defer un(trace(p, "ElementList"))
1206         }
1207
1208         for p.tok != token.RBRACE && p.tok != token.EOF {
1209                 list = append(list, p.parseElement(true))
1210                 if !p.atComma("composite literal") {
1211                         break
1212                 }
1213                 p.next()
1214         }
1215
1216         return
1217 }
1218
1219 func (p *parser) parseLiteralValue(typ ast.Expr) ast.Expr {
1220         if p.trace {
1221                 defer un(trace(p, "LiteralValue"))
1222         }
1223
1224         lbrace := p.expect(token.LBRACE)
1225         var elts []ast.Expr
1226         p.exprLev++
1227         if p.tok != token.RBRACE {
1228                 elts = p.parseElementList()
1229         }
1230         p.exprLev--
1231         rbrace := p.expectClosing(token.RBRACE, "composite literal")
1232         return &ast.CompositeLit{Type: typ, Lbrace: lbrace, Elts: elts, Rbrace: rbrace}
1233 }
1234
1235 // checkExpr checks that x is an expression (and not a type).
1236 func (p *parser) checkExpr(x ast.Expr) ast.Expr {
1237         switch unparen(x).(type) {
1238         case *ast.BadExpr:
1239         case *ast.Ident:
1240         case *ast.BasicLit:
1241         case *ast.FuncLit:
1242         case *ast.CompositeLit:
1243         case *ast.ParenExpr:
1244                 panic("unreachable")
1245         case *ast.SelectorExpr:
1246         case *ast.IndexExpr:
1247         case *ast.SliceExpr:
1248         case *ast.TypeAssertExpr:
1249                 // If t.Type == nil we have a type assertion of the form
1250                 // y.(type), which is only allowed in type switch expressions.
1251                 // It's hard to exclude those but for the case where we are in
1252                 // a type switch. Instead be lenient and test this in the type
1253                 // checker.
1254         case *ast.CallExpr:
1255         case *ast.StarExpr:
1256         case *ast.UnaryExpr:
1257         case *ast.BinaryExpr:
1258         default:
1259                 // all other nodes are not proper expressions
1260                 p.errorExpected(x.Pos(), "expression")
1261                 x = &ast.BadExpr{From: x.Pos(), To: x.End()}
1262         }
1263         return x
1264 }
1265
1266 // isTypeName returns true iff x is a (qualified) TypeName.
1267 func isTypeName(x ast.Expr) bool {
1268         switch t := x.(type) {
1269         case *ast.BadExpr:
1270         case *ast.Ident:
1271         case *ast.SelectorExpr:
1272                 _, isIdent := t.X.(*ast.Ident)
1273                 return isIdent
1274         default:
1275                 return false // all other nodes are not type names
1276         }
1277         return true
1278 }
1279
1280 // isLiteralType returns true iff x is a legal composite literal type.
1281 func isLiteralType(x ast.Expr) bool {
1282         switch t := x.(type) {
1283         case *ast.BadExpr:
1284         case *ast.Ident:
1285         case *ast.SelectorExpr:
1286                 _, isIdent := t.X.(*ast.Ident)
1287                 return isIdent
1288         case *ast.ArrayType:
1289         case *ast.StructType:
1290         case *ast.MapType:
1291         default:
1292                 return false // all other nodes are not legal composite literal types
1293         }
1294         return true
1295 }
1296
1297 // If x is of the form *T, deref returns T, otherwise it returns x.
1298 func deref(x ast.Expr) ast.Expr {
1299         if p, isPtr := x.(*ast.StarExpr); isPtr {
1300                 x = p.X
1301         }
1302         return x
1303 }
1304
1305 // If x is of the form (T), unparen returns unparen(T), otherwise it returns x.
1306 func unparen(x ast.Expr) ast.Expr {
1307         if p, isParen := x.(*ast.ParenExpr); isParen {
1308                 x = unparen(p.X)
1309         }
1310         return x
1311 }
1312
1313 // checkExprOrType checks that x is an expression or a type
1314 // (and not a raw type such as [...]T).
1315 //
1316 func (p *parser) checkExprOrType(x ast.Expr) ast.Expr {
1317         switch t := unparen(x).(type) {
1318         case *ast.ParenExpr:
1319                 panic("unreachable")
1320         case *ast.UnaryExpr:
1321         case *ast.ArrayType:
1322                 if len, isEllipsis := t.Len.(*ast.Ellipsis); isEllipsis {
1323                         p.error(len.Pos(), "expected array length, found '...'")
1324                         x = &ast.BadExpr{From: x.Pos(), To: x.End()}
1325                 }
1326         }
1327
1328         // all other nodes are expressions or types
1329         return x
1330 }
1331
1332 // If lhs is set and the result is an identifier, it is not resolved.
1333 func (p *parser) parsePrimaryExpr(lhs bool) ast.Expr {
1334         if p.trace {
1335                 defer un(trace(p, "PrimaryExpr"))
1336         }
1337
1338         x := p.parseOperand(lhs)
1339 L:
1340         for {
1341                 switch p.tok {
1342                 case token.PERIOD:
1343                         p.next()
1344                         if lhs {
1345                                 p.resolve(x)
1346                         }
1347                         switch p.tok {
1348                         case token.IDENT:
1349                                 x = p.parseSelector(p.checkExpr(x))
1350                         case token.LPAREN:
1351                                 x = p.parseTypeAssertion(p.checkExpr(x))
1352                         default:
1353                                 pos := p.pos
1354                                 p.errorExpected(pos, "selector or type assertion")
1355                                 p.next() // make progress
1356                                 x = &ast.BadExpr{From: pos, To: p.pos}
1357                         }
1358                 case token.LBRACK:
1359                         if lhs {
1360                                 p.resolve(x)
1361                         }
1362                         x = p.parseIndexOrSlice(p.checkExpr(x))
1363                 case token.LPAREN:
1364                         if lhs {
1365                                 p.resolve(x)
1366                         }
1367                         x = p.parseCallOrConversion(p.checkExprOrType(x))
1368                 case token.LBRACE:
1369                         if isLiteralType(x) && (p.exprLev >= 0 || !isTypeName(x)) {
1370                                 if lhs {
1371                                         p.resolve(x)
1372                                 }
1373                                 x = p.parseLiteralValue(x)
1374                         } else {
1375                                 break L
1376                         }
1377                 default:
1378                         break L
1379                 }
1380                 lhs = false // no need to try to resolve again
1381         }
1382
1383         return x
1384 }
1385
1386 // If lhs is set and the result is an identifier, it is not resolved.
1387 func (p *parser) parseUnaryExpr(lhs bool) ast.Expr {
1388         if p.trace {
1389                 defer un(trace(p, "UnaryExpr"))
1390         }
1391
1392         switch p.tok {
1393         case token.ADD, token.SUB, token.NOT, token.XOR, token.AND:
1394                 pos, op := p.pos, p.tok
1395                 p.next()
1396                 x := p.parseUnaryExpr(false)
1397                 return &ast.UnaryExpr{OpPos: pos, Op: op, X: p.checkExpr(x)}
1398
1399         case token.ARROW:
1400                 // channel type or receive expression
1401                 pos := p.pos
1402                 p.next()
1403                 if p.tok == token.CHAN {
1404                         p.next()
1405                         value := p.parseType()
1406                         return &ast.ChanType{Begin: pos, Dir: ast.RECV, Value: value}
1407                 }
1408
1409                 x := p.parseUnaryExpr(false)
1410                 return &ast.UnaryExpr{OpPos: pos, Op: token.ARROW, X: p.checkExpr(x)}
1411
1412         case token.MUL:
1413                 // pointer type or unary "*" expression
1414                 pos := p.pos
1415                 p.next()
1416                 x := p.parseUnaryExpr(false)
1417                 return &ast.StarExpr{Star: pos, X: p.checkExprOrType(x)}
1418         }
1419
1420         return p.parsePrimaryExpr(lhs)
1421 }
1422
1423 // If lhs is set and the result is an identifier, it is not resolved.
1424 func (p *parser) parseBinaryExpr(lhs bool, prec1 int) ast.Expr {
1425         if p.trace {
1426                 defer un(trace(p, "BinaryExpr"))
1427         }
1428
1429         x := p.parseUnaryExpr(lhs)
1430         for prec := p.tok.Precedence(); prec >= prec1; prec-- {
1431                 for p.tok.Precedence() == prec {
1432                         pos, op := p.pos, p.tok
1433                         p.next()
1434                         if lhs {
1435                                 p.resolve(x)
1436                                 lhs = false
1437                         }
1438                         y := p.parseBinaryExpr(false, prec+1)
1439                         x = &ast.BinaryExpr{X: p.checkExpr(x), OpPos: pos, Op: op, Y: p.checkExpr(y)}
1440                 }
1441         }
1442
1443         return x
1444 }
1445
1446 // If lhs is set and the result is an identifier, it is not resolved.
1447 // The result may be a type or even a raw type ([...]int). Callers must
1448 // check the result (using checkExpr or checkExprOrType), depending on
1449 // context.
1450 func (p *parser) parseExpr(lhs bool) ast.Expr {
1451         if p.trace {
1452                 defer un(trace(p, "Expression"))
1453         }
1454
1455         return p.parseBinaryExpr(lhs, token.LowestPrec+1)
1456 }
1457
1458 func (p *parser) parseRhs() ast.Expr {
1459         return p.checkExpr(p.parseExpr(false))
1460 }
1461
1462 func (p *parser) parseRhsOrType() ast.Expr {
1463         return p.checkExprOrType(p.parseExpr(false))
1464 }
1465
1466 // ----------------------------------------------------------------------------
1467 // Statements
1468
1469 // Parsing modes for parseSimpleStmt.
1470 const (
1471         basic = iota
1472         labelOk
1473         rangeOk
1474 )
1475
1476 // parseSimpleStmt returns true as 2nd result if it parsed the assignment
1477 // of a range clause (with mode == rangeOk). The returned statement is an
1478 // assignment with a right-hand side that is a single unary expression of
1479 // the form "range x". No guarantees are given for the left-hand side.
1480 func (p *parser) parseSimpleStmt(mode int) (ast.Stmt, bool) {
1481         if p.trace {
1482                 defer un(trace(p, "SimpleStmt"))
1483         }
1484
1485         x := p.parseLhsList()
1486
1487         switch p.tok {
1488         case
1489                 token.DEFINE, token.ASSIGN, token.ADD_ASSIGN,
1490                 token.SUB_ASSIGN, token.MUL_ASSIGN, token.QUO_ASSIGN,
1491                 token.REM_ASSIGN, token.AND_ASSIGN, token.OR_ASSIGN,
1492                 token.XOR_ASSIGN, token.SHL_ASSIGN, token.SHR_ASSIGN, token.AND_NOT_ASSIGN:
1493                 // assignment statement, possibly part of a range clause
1494                 pos, tok := p.pos, p.tok
1495                 p.next()
1496                 var y []ast.Expr
1497                 isRange := false
1498                 if mode == rangeOk && p.tok == token.RANGE && (tok == token.DEFINE || tok == token.ASSIGN) {
1499                         pos := p.pos
1500                         p.next()
1501                         y = []ast.Expr{&ast.UnaryExpr{OpPos: pos, Op: token.RANGE, X: p.parseRhs()}}
1502                         isRange = true
1503                 } else {
1504                         y = p.parseRhsList()
1505                 }
1506                 as := &ast.AssignStmt{Lhs: x, TokPos: pos, Tok: tok, Rhs: y}
1507                 if tok == token.DEFINE {
1508                         p.shortVarDecl(as, x)
1509                 }
1510                 return as, isRange
1511         }
1512
1513         if len(x) > 1 {
1514                 p.errorExpected(x[0].Pos(), "1 expression")
1515                 // continue with first expression
1516         }
1517
1518         switch p.tok {
1519         case token.COLON:
1520                 // labeled statement
1521                 colon := p.pos
1522                 p.next()
1523                 if label, isIdent := x[0].(*ast.Ident); mode == labelOk && isIdent {
1524                         // Go spec: The scope of a label is the body of the function
1525                         // in which it is declared and excludes the body of any nested
1526                         // function.
1527                         stmt := &ast.LabeledStmt{Label: label, Colon: colon, Stmt: p.parseStmt()}
1528                         p.declare(stmt, nil, p.labelScope, ast.Lbl, label)
1529                         return stmt, false
1530                 }
1531                 // The label declaration typically starts at x[0].Pos(), but the label
1532                 // declaration may be erroneous due to a token after that position (and
1533                 // before the ':'). If SpuriousErrors is not set, the (only) error re-
1534                 // ported for the line is the illegal label error instead of the token
1535                 // before the ':' that caused the problem. Thus, use the (latest) colon
1536                 // position for error reporting.
1537                 p.error(colon, "illegal label declaration")
1538                 return &ast.BadStmt{From: x[0].Pos(), To: colon + 1}, false
1539
1540         case token.ARROW:
1541                 // send statement
1542                 arrow := p.pos
1543                 p.next()
1544                 y := p.parseRhs()
1545                 return &ast.SendStmt{Chan: x[0], Arrow: arrow, Value: y}, false
1546
1547         case token.INC, token.DEC:
1548                 // increment or decrement
1549                 s := &ast.IncDecStmt{X: x[0], TokPos: p.pos, Tok: p.tok}
1550                 p.next()
1551                 return s, false
1552         }
1553
1554         // expression
1555         return &ast.ExprStmt{X: x[0]}, false
1556 }
1557
1558 func (p *parser) parseCallExpr() *ast.CallExpr {
1559         x := p.parseRhsOrType() // could be a conversion: (some type)(x)
1560         if call, isCall := x.(*ast.CallExpr); isCall {
1561                 return call
1562         }
1563         if _, isBad := x.(*ast.BadExpr); !isBad {
1564                 // only report error if it's a new one
1565                 p.errorExpected(x.Pos(), "function/method call")
1566         }
1567         return nil
1568 }
1569
1570 func (p *parser) parseGoStmt() ast.Stmt {
1571         if p.trace {
1572                 defer un(trace(p, "GoStmt"))
1573         }
1574
1575         pos := p.expect(token.GO)
1576         call := p.parseCallExpr()
1577         p.expectSemi()
1578         if call == nil {
1579                 return &ast.BadStmt{From: pos, To: pos + 2} // len("go")
1580         }
1581
1582         return &ast.GoStmt{Go: pos, Call: call}
1583 }
1584
1585 func (p *parser) parseDeferStmt() ast.Stmt {
1586         if p.trace {
1587                 defer un(trace(p, "DeferStmt"))
1588         }
1589
1590         pos := p.expect(token.DEFER)
1591         call := p.parseCallExpr()
1592         p.expectSemi()
1593         if call == nil {
1594                 return &ast.BadStmt{From: pos, To: pos + 5} // len("defer")
1595         }
1596
1597         return &ast.DeferStmt{Defer: pos, Call: call}
1598 }
1599
1600 func (p *parser) parseReturnStmt() *ast.ReturnStmt {
1601         if p.trace {
1602                 defer un(trace(p, "ReturnStmt"))
1603         }
1604
1605         pos := p.pos
1606         p.expect(token.RETURN)
1607         var x []ast.Expr
1608         if p.tok != token.SEMICOLON && p.tok != token.RBRACE {
1609                 x = p.parseRhsList()
1610         }
1611         p.expectSemi()
1612
1613         return &ast.ReturnStmt{Return: pos, Results: x}
1614 }
1615
1616 func (p *parser) parseBranchStmt(tok token.Token) *ast.BranchStmt {
1617         if p.trace {
1618                 defer un(trace(p, "BranchStmt"))
1619         }
1620
1621         pos := p.expect(tok)
1622         var label *ast.Ident
1623         if tok != token.FALLTHROUGH && p.tok == token.IDENT {
1624                 label = p.parseIdent()
1625                 // add to list of unresolved targets
1626                 n := len(p.targetStack) - 1
1627                 p.targetStack[n] = append(p.targetStack[n], label)
1628         }
1629         p.expectSemi()
1630
1631         return &ast.BranchStmt{TokPos: pos, Tok: tok, Label: label}
1632 }
1633
1634 func (p *parser) makeExpr(s ast.Stmt) ast.Expr {
1635         if s == nil {
1636                 return nil
1637         }
1638         if es, isExpr := s.(*ast.ExprStmt); isExpr {
1639                 return p.checkExpr(es.X)
1640         }
1641         p.error(s.Pos(), "expected condition, found simple statement")
1642         return &ast.BadExpr{From: s.Pos(), To: s.End()}
1643 }
1644
1645 func (p *parser) parseIfStmt() *ast.IfStmt {
1646         if p.trace {
1647                 defer un(trace(p, "IfStmt"))
1648         }
1649
1650         pos := p.expect(token.IF)
1651         p.openScope()
1652         defer p.closeScope()
1653
1654         var s ast.Stmt
1655         var x ast.Expr
1656         {
1657                 prevLev := p.exprLev
1658                 p.exprLev = -1
1659                 if p.tok == token.SEMICOLON {
1660                         p.next()
1661                         x = p.parseRhs()
1662                 } else {
1663                         s, _ = p.parseSimpleStmt(basic)
1664                         if p.tok == token.SEMICOLON {
1665                                 p.next()
1666                                 x = p.parseRhs()
1667                         } else {
1668                                 x = p.makeExpr(s)
1669                                 s = nil
1670                         }
1671                 }
1672                 p.exprLev = prevLev
1673         }
1674
1675         body := p.parseBlockStmt()
1676         var else_ ast.Stmt
1677         if p.tok == token.ELSE {
1678                 p.next()
1679                 else_ = p.parseStmt()
1680         } else {
1681                 p.expectSemi()
1682         }
1683
1684         return &ast.IfStmt{If: pos, Init: s, Cond: x, Body: body, Else: else_}
1685 }
1686
1687 func (p *parser) parseTypeList() (list []ast.Expr) {
1688         if p.trace {
1689                 defer un(trace(p, "TypeList"))
1690         }
1691
1692         list = append(list, p.parseType())
1693         for p.tok == token.COMMA {
1694                 p.next()
1695                 list = append(list, p.parseType())
1696         }
1697
1698         return
1699 }
1700
1701 func (p *parser) parseCaseClause(typeSwitch bool) *ast.CaseClause {
1702         if p.trace {
1703                 defer un(trace(p, "CaseClause"))
1704         }
1705
1706         pos := p.pos
1707         var list []ast.Expr
1708         if p.tok == token.CASE {
1709                 p.next()
1710                 if typeSwitch {
1711                         list = p.parseTypeList()
1712                 } else {
1713                         list = p.parseRhsList()
1714                 }
1715         } else {
1716                 p.expect(token.DEFAULT)
1717         }
1718
1719         colon := p.expect(token.COLON)
1720         p.openScope()
1721         body := p.parseStmtList()
1722         p.closeScope()
1723
1724         return &ast.CaseClause{Case: pos, List: list, Colon: colon, Body: body}
1725 }
1726
1727 func isTypeSwitchAssert(x ast.Expr) bool {
1728         a, ok := x.(*ast.TypeAssertExpr)
1729         return ok && a.Type == nil
1730 }
1731
1732 func isTypeSwitchGuard(s ast.Stmt) bool {
1733         switch t := s.(type) {
1734         case *ast.ExprStmt:
1735                 // x.(nil)
1736                 return isTypeSwitchAssert(t.X)
1737         case *ast.AssignStmt:
1738                 // v := x.(nil)
1739                 return len(t.Lhs) == 1 && t.Tok == token.DEFINE && len(t.Rhs) == 1 && isTypeSwitchAssert(t.Rhs[0])
1740         }
1741         return false
1742 }
1743
1744 func (p *parser) parseSwitchStmt() ast.Stmt {
1745         if p.trace {
1746                 defer un(trace(p, "SwitchStmt"))
1747         }
1748
1749         pos := p.expect(token.SWITCH)
1750         p.openScope()
1751         defer p.closeScope()
1752
1753         var s1, s2 ast.Stmt
1754         if p.tok != token.LBRACE {
1755                 prevLev := p.exprLev
1756                 p.exprLev = -1
1757                 if p.tok != token.SEMICOLON {
1758                         s2, _ = p.parseSimpleStmt(basic)
1759                 }
1760                 if p.tok == token.SEMICOLON {
1761                         p.next()
1762                         s1 = s2
1763                         s2 = nil
1764                         if p.tok != token.LBRACE {
1765                                 // A TypeSwitchGuard may declare a variable in addition
1766                                 // to the variable declared in the initial SimpleStmt.
1767                                 // Introduce extra scope to avoid redeclaration errors:
1768                                 //
1769                                 //      switch t := 0; t := x.(T) { ... }
1770                                 //
1771                                 // (this code is not valid Go because the first t will
1772                                 // cannot be accessed and thus is never used, the extra
1773                                 // scope is needed for the correct error message).
1774                                 //
1775                                 // If we don't have a type switch, s2 must be an expression.
1776                                 // Having the extra nested but empty scope won't affect it.
1777                                 p.openScope()
1778                                 defer p.closeScope()
1779                                 s2, _ = p.parseSimpleStmt(basic)
1780                         }
1781                 }
1782                 p.exprLev = prevLev
1783         }
1784
1785         typeSwitch := isTypeSwitchGuard(s2)
1786         lbrace := p.expect(token.LBRACE)
1787         var list []ast.Stmt
1788         for p.tok == token.CASE || p.tok == token.DEFAULT {
1789                 list = append(list, p.parseCaseClause(typeSwitch))
1790         }
1791         rbrace := p.expect(token.RBRACE)
1792         p.expectSemi()
1793         body := &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace}
1794
1795         if typeSwitch {
1796                 return &ast.TypeSwitchStmt{Switch: pos, Init: s1, Assign: s2, Body: body}
1797         }
1798
1799         return &ast.SwitchStmt{Switch: pos, Init: s1, Tag: p.makeExpr(s2), Body: body}
1800 }
1801
1802 func (p *parser) parseCommClause() *ast.CommClause {
1803         if p.trace {
1804                 defer un(trace(p, "CommClause"))
1805         }
1806
1807         p.openScope()
1808         pos := p.pos
1809         var comm ast.Stmt
1810         if p.tok == token.CASE {
1811                 p.next()
1812                 lhs := p.parseLhsList()
1813                 if p.tok == token.ARROW {
1814                         // SendStmt
1815                         if len(lhs) > 1 {
1816                                 p.errorExpected(lhs[0].Pos(), "1 expression")
1817                                 // continue with first expression
1818                         }
1819                         arrow := p.pos
1820                         p.next()
1821                         rhs := p.parseRhs()
1822                         comm = &ast.SendStmt{Chan: lhs[0], Arrow: arrow, Value: rhs}
1823                 } else {
1824                         // RecvStmt
1825                         if tok := p.tok; tok == token.ASSIGN || tok == token.DEFINE {
1826                                 // RecvStmt with assignment
1827                                 if len(lhs) > 2 {
1828                                         p.errorExpected(lhs[0].Pos(), "1 or 2 expressions")
1829                                         // continue with first two expressions
1830                                         lhs = lhs[0:2]
1831                                 }
1832                                 pos := p.pos
1833                                 p.next()
1834                                 rhs := p.parseRhs()
1835                                 as := &ast.AssignStmt{Lhs: lhs, TokPos: pos, Tok: tok, Rhs: []ast.Expr{rhs}}
1836                                 if tok == token.DEFINE {
1837                                         p.shortVarDecl(as, lhs)
1838                                 }
1839                                 comm = as
1840                         } else {
1841                                 // lhs must be single receive operation
1842                                 if len(lhs) > 1 {
1843                                         p.errorExpected(lhs[0].Pos(), "1 expression")
1844                                         // continue with first expression
1845                                 }
1846                                 comm = &ast.ExprStmt{X: lhs[0]}
1847                         }
1848                 }
1849         } else {
1850                 p.expect(token.DEFAULT)
1851         }
1852
1853         colon := p.expect(token.COLON)
1854         body := p.parseStmtList()
1855         p.closeScope()
1856
1857         return &ast.CommClause{Case: pos, Comm: comm, Colon: colon, Body: body}
1858 }
1859
1860 func (p *parser) parseSelectStmt() *ast.SelectStmt {
1861         if p.trace {
1862                 defer un(trace(p, "SelectStmt"))
1863         }
1864
1865         pos := p.expect(token.SELECT)
1866         lbrace := p.expect(token.LBRACE)
1867         var list []ast.Stmt
1868         for p.tok == token.CASE || p.tok == token.DEFAULT {
1869                 list = append(list, p.parseCommClause())
1870         }
1871         rbrace := p.expect(token.RBRACE)
1872         p.expectSemi()
1873         body := &ast.BlockStmt{Lbrace: lbrace, List: list, Rbrace: rbrace}
1874
1875         return &ast.SelectStmt{Select: pos, Body: body}
1876 }
1877
1878 func (p *parser) parseForStmt() ast.Stmt {
1879         if p.trace {
1880                 defer un(trace(p, "ForStmt"))
1881         }
1882
1883         pos := p.expect(token.FOR)
1884         p.openScope()
1885         defer p.closeScope()
1886
1887         var s1, s2, s3 ast.Stmt
1888         var isRange bool
1889         if p.tok != token.LBRACE {
1890                 prevLev := p.exprLev
1891                 p.exprLev = -1
1892                 if p.tok != token.SEMICOLON {
1893                         s2, isRange = p.parseSimpleStmt(rangeOk)
1894                 }
1895                 if !isRange && p.tok == token.SEMICOLON {
1896                         p.next()
1897                         s1 = s2
1898                         s2 = nil
1899                         if p.tok != token.SEMICOLON {
1900                                 s2, _ = p.parseSimpleStmt(basic)
1901                         }
1902                         p.expectSemi()
1903                         if p.tok != token.LBRACE {
1904                                 s3, _ = p.parseSimpleStmt(basic)
1905                         }
1906                 }
1907                 p.exprLev = prevLev
1908         }
1909
1910         body := p.parseBlockStmt()
1911         p.expectSemi()
1912
1913         if isRange {
1914                 as := s2.(*ast.AssignStmt)
1915                 // check lhs
1916                 var key, value ast.Expr
1917                 switch len(as.Lhs) {
1918                 case 2:
1919                         key, value = as.Lhs[0], as.Lhs[1]
1920                 case 1:
1921                         key = as.Lhs[0]
1922                 default:
1923                         p.errorExpected(as.Lhs[0].Pos(), "1 or 2 expressions")
1924                         return &ast.BadStmt{From: pos, To: body.End()}
1925                 }
1926                 // parseSimpleStmt returned a right-hand side that
1927                 // is a single unary expression of the form "range x"
1928                 x := as.Rhs[0].(*ast.UnaryExpr).X
1929                 return &ast.RangeStmt{
1930                         For:    pos,
1931                         Key:    key,
1932                         Value:  value,
1933                         TokPos: as.TokPos,
1934                         Tok:    as.Tok,
1935                         X:      x,
1936                         Body:   body,
1937                 }
1938         }
1939
1940         // regular for statement
1941         return &ast.ForStmt{
1942                 For:  pos,
1943                 Init: s1,
1944                 Cond: p.makeExpr(s2),
1945                 Post: s3,
1946                 Body: body,
1947         }
1948 }
1949
1950 func (p *parser) parseStmt() (s ast.Stmt) {
1951         if p.trace {
1952                 defer un(trace(p, "Statement"))
1953         }
1954
1955         switch p.tok {
1956         case token.CONST, token.TYPE, token.VAR:
1957                 s = &ast.DeclStmt{Decl: p.parseDecl(syncStmt)}
1958         case
1959                 // tokens that may start an expression
1960                 token.IDENT, token.INT, token.FLOAT, token.IMAG, token.CHAR, token.STRING, token.FUNC, token.LPAREN, // operands
1961                 token.LBRACK, token.STRUCT, // composite types
1962                 token.ADD, token.SUB, token.MUL, token.AND, token.XOR, token.ARROW, token.NOT: // unary operators
1963                 s, _ = p.parseSimpleStmt(labelOk)
1964                 // because of the required look-ahead, labeled statements are
1965                 // parsed by parseSimpleStmt - don't expect a semicolon after
1966                 // them
1967                 if _, isLabeledStmt := s.(*ast.LabeledStmt); !isLabeledStmt {
1968                         p.expectSemi()
1969                 }
1970         case token.GO:
1971                 s = p.parseGoStmt()
1972         case token.DEFER:
1973                 s = p.parseDeferStmt()
1974         case token.RETURN:
1975                 s = p.parseReturnStmt()
1976         case token.BREAK, token.CONTINUE, token.GOTO, token.FALLTHROUGH:
1977                 s = p.parseBranchStmt(p.tok)
1978         case token.LBRACE:
1979                 s = p.parseBlockStmt()
1980                 p.expectSemi()
1981         case token.IF:
1982                 s = p.parseIfStmt()
1983         case token.SWITCH:
1984                 s = p.parseSwitchStmt()
1985         case token.SELECT:
1986                 s = p.parseSelectStmt()
1987         case token.FOR:
1988                 s = p.parseForStmt()
1989         case token.SEMICOLON:
1990                 s = &ast.EmptyStmt{Semicolon: p.pos}
1991                 p.next()
1992         case token.RBRACE:
1993                 // a semicolon may be omitted before a closing "}"
1994                 s = &ast.EmptyStmt{Semicolon: p.pos}
1995         default:
1996                 // no statement found
1997                 pos := p.pos
1998                 p.errorExpected(pos, "statement")
1999                 syncStmt(p)
2000                 s = &ast.BadStmt{From: pos, To: p.pos}
2001         }
2002
2003         return
2004 }
2005
2006 // ----------------------------------------------------------------------------
2007 // Declarations
2008
2009 type parseSpecFunction func(p *parser, doc *ast.CommentGroup, iota int) ast.Spec
2010
2011 func isValidImport(lit string) bool {
2012         const illegalChars = `!"#$%&'()*,:;<=>?[\]^{|}` + "`\uFFFD"
2013         s, _ := strconv.Unquote(lit) // go/scanner returns a legal string literal
2014         for _, r := range s {
2015                 if !unicode.IsGraphic(r) || unicode.IsSpace(r) || strings.ContainsRune(illegalChars, r) {
2016                         return false
2017                 }
2018         }
2019         return s != ""
2020 }
2021
2022 func parseImportSpec(p *parser, doc *ast.CommentGroup, _ int) ast.Spec {
2023         if p.trace {
2024                 defer un(trace(p, "ImportSpec"))
2025         }
2026
2027         var ident *ast.Ident
2028         switch p.tok {
2029         case token.PERIOD:
2030                 ident = &ast.Ident{NamePos: p.pos, Name: "."}
2031                 p.next()
2032         case token.IDENT:
2033                 ident = p.parseIdent()
2034         }
2035
2036         var path *ast.BasicLit
2037         if p.tok == token.STRING {
2038                 if !isValidImport(p.lit) {
2039                         p.error(p.pos, "invalid import path: "+p.lit)
2040                 }
2041                 path = &ast.BasicLit{ValuePos: p.pos, Kind: p.tok, Value: p.lit}
2042                 p.next()
2043         } else {
2044                 p.expect(token.STRING) // use expect() error handling
2045         }
2046         p.expectSemi() // call before accessing p.linecomment
2047
2048         // collect imports
2049         spec := &ast.ImportSpec{
2050                 Doc:     doc,
2051                 Name:    ident,
2052                 Path:    path,
2053                 Comment: p.lineComment,
2054         }
2055         p.imports = append(p.imports, spec)
2056
2057         return spec
2058 }
2059
2060 func parseConstSpec(p *parser, doc *ast.CommentGroup, iota int) ast.Spec {
2061         if p.trace {
2062                 defer un(trace(p, "ConstSpec"))
2063         }
2064
2065         idents := p.parseIdentList()
2066         typ := p.tryType()
2067         var values []ast.Expr
2068         if typ != nil || p.tok == token.ASSIGN || iota == 0 {
2069                 p.expect(token.ASSIGN)
2070                 values = p.parseRhsList()
2071         }
2072         p.expectSemi() // call before accessing p.linecomment
2073
2074         // Go spec: The scope of a constant or variable identifier declared inside
2075         // a function begins at the end of the ConstSpec or VarSpec and ends at
2076         // the end of the innermost containing block.
2077         // (Global identifiers are resolved in a separate phase after parsing.)
2078         spec := &ast.ValueSpec{
2079                 Doc:     doc,
2080                 Names:   idents,
2081                 Type:    typ,
2082                 Values:  values,
2083                 Comment: p.lineComment,
2084         }
2085         p.declare(spec, iota, p.topScope, ast.Con, idents...)
2086
2087         return spec
2088 }
2089
2090 func parseTypeSpec(p *parser, doc *ast.CommentGroup, _ int) ast.Spec {
2091         if p.trace {
2092                 defer un(trace(p, "TypeSpec"))
2093         }
2094
2095         ident := p.parseIdent()
2096
2097         // Go spec: The scope of a type identifier declared inside a function begins
2098         // at the identifier in the TypeSpec and ends at the end of the innermost
2099         // containing block.
2100         // (Global identifiers are resolved in a separate phase after parsing.)
2101         spec := &ast.TypeSpec{Doc: doc, Name: ident}
2102         p.declare(spec, nil, p.topScope, ast.Typ, ident)
2103
2104         spec.Type = p.parseType()
2105         p.expectSemi() // call before accessing p.linecomment
2106         spec.Comment = p.lineComment
2107
2108         return spec
2109 }
2110
2111 func parseVarSpec(p *parser, doc *ast.CommentGroup, _ int) ast.Spec {
2112         if p.trace {
2113                 defer un(trace(p, "VarSpec"))
2114         }
2115
2116         idents := p.parseIdentList()
2117         typ := p.tryType()
2118         var values []ast.Expr
2119         if typ == nil || p.tok == token.ASSIGN {
2120                 p.expect(token.ASSIGN)
2121                 values = p.parseRhsList()
2122         }
2123         p.expectSemi() // call before accessing p.linecomment
2124
2125         // Go spec: The scope of a constant or variable identifier declared inside
2126         // a function begins at the end of the ConstSpec or VarSpec and ends at
2127         // the end of the innermost containing block.
2128         // (Global identifiers are resolved in a separate phase after parsing.)
2129         spec := &ast.ValueSpec{
2130                 Doc:     doc,
2131                 Names:   idents,
2132                 Type:    typ,
2133                 Values:  values,
2134                 Comment: p.lineComment,
2135         }
2136         p.declare(spec, nil, p.topScope, ast.Var, idents...)
2137
2138         return spec
2139 }
2140
2141 func (p *parser) parseGenDecl(keyword token.Token, f parseSpecFunction) *ast.GenDecl {
2142         if p.trace {
2143                 defer un(trace(p, "GenDecl("+keyword.String()+")"))
2144         }
2145
2146         doc := p.leadComment
2147         pos := p.expect(keyword)
2148         var lparen, rparen token.Pos
2149         var list []ast.Spec
2150         if p.tok == token.LPAREN {
2151                 lparen = p.pos
2152                 p.next()
2153                 for iota := 0; p.tok != token.RPAREN && p.tok != token.EOF; iota++ {
2154                         list = append(list, f(p, p.leadComment, iota))
2155                 }
2156                 rparen = p.expect(token.RPAREN)
2157                 p.expectSemi()
2158         } else {
2159                 list = append(list, f(p, nil, 0))
2160         }
2161
2162         return &ast.GenDecl{
2163                 Doc:    doc,
2164                 TokPos: pos,
2165                 Tok:    keyword,
2166                 Lparen: lparen,
2167                 Specs:  list,
2168                 Rparen: rparen,
2169         }
2170 }
2171
2172 func (p *parser) parseReceiver(scope *ast.Scope) *ast.FieldList {
2173         if p.trace {
2174                 defer un(trace(p, "Receiver"))
2175         }
2176
2177         par := p.parseParameters(scope, false)
2178
2179         // must have exactly one receiver
2180         if par.NumFields() != 1 {
2181                 p.errorExpected(par.Opening, "exactly one receiver")
2182                 par.List = []*ast.Field{{Type: &ast.BadExpr{From: par.Opening, To: par.Closing + 1}}}
2183                 return par
2184         }
2185
2186         // recv type must be of the form ["*"] identifier
2187         recv := par.List[0]
2188         base := deref(recv.Type)
2189         if _, isIdent := base.(*ast.Ident); !isIdent {
2190                 if _, isBad := base.(*ast.BadExpr); !isBad {
2191                         // only report error if it's a new one
2192                         p.errorExpected(base.Pos(), "(unqualified) identifier")
2193                 }
2194                 par.List = []*ast.Field{
2195                         {Type: &ast.BadExpr{From: recv.Pos(), To: recv.End()}},
2196                 }
2197         }
2198
2199         return par
2200 }
2201
2202 func (p *parser) parseFuncDecl() *ast.FuncDecl {
2203         if p.trace {
2204                 defer un(trace(p, "FunctionDecl"))
2205         }
2206
2207         doc := p.leadComment
2208         pos := p.expect(token.FUNC)
2209         scope := ast.NewScope(p.topScope) // function scope
2210
2211         var recv *ast.FieldList
2212         if p.tok == token.LPAREN {
2213                 recv = p.parseReceiver(scope)
2214         }
2215
2216         ident := p.parseIdent()
2217
2218         params, results := p.parseSignature(scope)
2219
2220         var body *ast.BlockStmt
2221         if p.tok == token.LBRACE {
2222                 body = p.parseBody(scope)
2223         }
2224         p.expectSemi()
2225
2226         decl := &ast.FuncDecl{
2227                 Doc:  doc,
2228                 Recv: recv,
2229                 Name: ident,
2230                 Type: &ast.FuncType{
2231                         Func:    pos,
2232                         Params:  params,
2233                         Results: results,
2234                 },
2235                 Body: body,
2236         }
2237         if recv == nil {
2238                 // Go spec: The scope of an identifier denoting a constant, type,
2239                 // variable, or function (but not method) declared at top level
2240                 // (outside any function) is the package block.
2241                 //
2242                 // init() functions cannot be referred to and there may
2243                 // be more than one - don't put them in the pkgScope
2244                 if ident.Name != "init" {
2245                         p.declare(decl, nil, p.pkgScope, ast.Fun, ident)
2246                 }
2247         }
2248
2249         return decl
2250 }
2251
2252 func (p *parser) parseDecl(sync func(*parser)) ast.Decl {
2253         if p.trace {
2254                 defer un(trace(p, "Declaration"))
2255         }
2256
2257         var f parseSpecFunction
2258         switch p.tok {
2259         case token.CONST:
2260                 f = parseConstSpec
2261
2262         case token.TYPE:
2263                 f = parseTypeSpec
2264
2265         case token.VAR:
2266                 f = parseVarSpec
2267
2268         case token.FUNC:
2269                 return p.parseFuncDecl()
2270
2271         default:
2272                 pos := p.pos
2273                 p.errorExpected(pos, "declaration")
2274                 sync(p)
2275                 return &ast.BadDecl{From: pos, To: p.pos}
2276         }
2277
2278         return p.parseGenDecl(p.tok, f)
2279 }
2280
2281 // ----------------------------------------------------------------------------
2282 // Source files
2283
2284 func (p *parser) parseFile() *ast.File {
2285         if p.trace {
2286                 defer un(trace(p, "File"))
2287         }
2288
2289         // package clause
2290         doc := p.leadComment
2291         pos := p.expect(token.PACKAGE)
2292         // Go spec: The package clause is not a declaration;
2293         // the package name does not appear in any scope.
2294         ident := p.parseIdent()
2295         if ident.Name == "_" {
2296                 p.error(p.pos, "invalid package name _")
2297         }
2298         p.expectSemi()
2299
2300         var decls []ast.Decl
2301
2302         // Don't bother parsing the rest if we had errors already.
2303         // Likely not a Go source file at all.
2304
2305         if p.errors.Len() == 0 && p.mode&PackageClauseOnly == 0 {
2306                 // import decls
2307                 for p.tok == token.IMPORT {
2308                         decls = append(decls, p.parseGenDecl(token.IMPORT, parseImportSpec))
2309                 }
2310
2311                 if p.mode&ImportsOnly == 0 {
2312                         // rest of package body
2313                         for p.tok != token.EOF {
2314                                 decls = append(decls, p.parseDecl(syncDecl))
2315                         }
2316                 }
2317         }
2318
2319         assert(p.topScope == p.pkgScope, "imbalanced scopes")
2320
2321         // resolve global identifiers within the same file
2322         i := 0
2323         for _, ident := range p.unresolved {
2324                 // i <= index for current ident
2325                 assert(ident.Obj == unresolved, "object already resolved")
2326                 ident.Obj = p.pkgScope.Lookup(ident.Name) // also removes unresolved sentinel
2327                 if ident.Obj == nil {
2328                         p.unresolved[i] = ident
2329                         i++
2330                 }
2331         }
2332
2333         return &ast.File{
2334                 Doc:        doc,
2335                 Package:    pos,
2336                 Name:       ident,
2337                 Decls:      decls,
2338                 Scope:      p.pkgScope,
2339                 Imports:    p.imports,
2340                 Unresolved: p.unresolved[0:i],
2341                 Comments:   p.comments,
2342         }
2343 }