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