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