in build/parse.y.go [846:2091]
func (yyrcvr *yyParserImpl) Parse(yylex yyLexer) int {
var yyn int
var yyVAL yySymType
var yyDollar []yySymType
_ = yyDollar // silence set and not used
yyS := yyrcvr.stack[:]
Nerrs := 0 /* number of errors */
Errflag := 0 /* error recovery flag */
yystate := 0
yyrcvr.char = -1
yytoken := -1 // yyrcvr.char translated into internal numbering
defer func() {
// Make sure we report no lookahead when not parsing.
yystate = -1
yyrcvr.char = -1
yytoken = -1
}()
yyp := -1
goto yystack
ret0:
return 0
ret1:
return 1
yystack:
/* put a state and value onto the stack */
if yyDebug >= 4 {
__yyfmt__.Printf("char %v in %v\n", yyTokname(yytoken), yyStatname(yystate))
}
yyp++
if yyp >= len(yyS) {
nyys := make([]yySymType, len(yyS)*2)
copy(nyys, yyS)
yyS = nyys
}
yyS[yyp] = yyVAL
yyS[yyp].yys = yystate
yynewstate:
yyn = yyPact[yystate]
if yyn <= yyFlag {
goto yydefault /* simple state */
}
if yyrcvr.char < 0 {
yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval)
}
yyn += yytoken
if yyn < 0 || yyn >= yyLast {
goto yydefault
}
yyn = yyAct[yyn]
if yyChk[yyn] == yytoken { /* valid shift */
yyrcvr.char = -1
yytoken = -1
yyVAL = yyrcvr.lval
yystate = yyn
if Errflag > 0 {
Errflag--
}
goto yystack
}
yydefault:
/* default state action */
yyn = yyDef[yystate]
if yyn == -2 {
if yyrcvr.char < 0 {
yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval)
}
/* look through exception table */
xi := 0
for {
if yyExca[xi+0] == -1 && yyExca[xi+1] == yystate {
break
}
xi += 2
}
for xi += 2; ; xi += 2 {
yyn = yyExca[xi+0]
if yyn < 0 || yyn == yytoken {
break
}
}
yyn = yyExca[xi+1]
if yyn < 0 {
goto ret0
}
}
if yyn == 0 {
/* error ... attempt to resume parsing */
switch Errflag {
case 0: /* brand new error */
yylex.Error(yyErrorMessage(yystate, yytoken))
Nerrs++
if yyDebug >= 1 {
__yyfmt__.Printf("%s", yyStatname(yystate))
__yyfmt__.Printf(" saw %s\n", yyTokname(yytoken))
}
fallthrough
case 1, 2: /* incompletely recovered error ... try again */
Errflag = 3
/* find a state where "error" is a legal shift action */
for yyp >= 0 {
yyn = yyPact[yyS[yyp].yys] + yyErrCode
if yyn >= 0 && yyn < yyLast {
yystate = yyAct[yyn] /* simulate a shift of "error" */
if yyChk[yystate] == yyErrCode {
goto yystack
}
}
/* the current p has no shift on "error", pop stack */
if yyDebug >= 2 {
__yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys)
}
yyp--
}
/* there is no state on the stack with an error shift ... abort */
goto ret1
case 3: /* no shift yet; clobber input char */
if yyDebug >= 2 {
__yyfmt__.Printf("error recovery discards %s\n", yyTokname(yytoken))
}
if yytoken == yyEofCode {
goto ret1
}
yyrcvr.char = -1
yytoken = -1
goto yynewstate /* try again in the same state */
}
}
/* reduction by production yyn */
if yyDebug >= 2 {
__yyfmt__.Printf("reduce %v in:\n\t%v\n", yyn, yyStatname(yystate))
}
yynt := yyn
yypt := yyp
_ = yypt // guard against "declared and not used"
yyp -= yyR2[yyn]
// yyp is now the index of $0. Perform the default action. Iff the
// reduced production is ε, $1 is possibly out of range.
if yyp+1 >= len(yyS) {
nyys := make([]yySymType, len(yyS)*2)
copy(nyys, yyS)
yyS = nyys
}
yyVAL = yyS[yyp+1]
/* consult goto table to find next state */
yyn = yyR1[yyn]
yyg := yyPgo[yyn]
yyj := yyg + yyS[yyp].yys + 1
if yyj >= yyLast {
yystate = yyAct[yyg]
} else {
yystate = yyAct[yyj]
if yyChk[yystate] != -yyn {
yystate = yyAct[yyg]
}
}
// dummy call; replaced with literal code
switch yynt {
case 1:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:218
{
yylex.(*input).file = &File{Stmt: yyDollar[1].exprs}
return 0
}
case 2:
yyDollar = yyS[yypt-5 : yypt+1]
//line build/parse.y:225
{
statements := yyDollar[4].exprs
if yyDollar[2].exprs != nil {
// $2 can only contain *CommentBlock objects, each of them contains a non-empty After slice
cb := yyDollar[2].exprs[len(yyDollar[2].exprs)-1].(*CommentBlock)
// $4 can't be empty and can't start with a comment
stmt := yyDollar[4].exprs[0]
start, _ := stmt.Span()
if start.Line-cb.After[len(cb.After)-1].Start.Line == 1 {
// The first statement of $4 starts on the next line after the last comment of $2.
// Attach the last comment to the first statement
stmt.Comment().Before = cb.After
yyDollar[2].exprs = yyDollar[2].exprs[:len(yyDollar[2].exprs)-1]
}
statements = append(yyDollar[2].exprs, yyDollar[4].exprs...)
}
yyVAL.exprs = statements
yyVAL.lastStmt = yyDollar[4].lastStmt
}
case 3:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:245
{
yyVAL.exprs = yyDollar[1].exprs
}
case 6:
yyDollar = yyS[yypt-0 : yypt+1]
//line build/parse.y:253
{
yyVAL.exprs = nil
yyVAL.lastStmt = nil
}
case 7:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:258
{
yyVAL.exprs = yyDollar[1].exprs
yyVAL.lastStmt = yyDollar[1].lastStmt
if yyVAL.lastStmt == nil {
cb := &CommentBlock{Start: yyDollar[2].pos}
yyVAL.exprs = append(yyVAL.exprs, cb)
yyVAL.lastStmt = cb
}
com := yyVAL.lastStmt.Comment()
com.After = append(com.After, Comment{Start: yyDollar[2].pos, Token: yyDollar[2].tok})
}
case 8:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:270
{
yyVAL.exprs = yyDollar[1].exprs
yyVAL.lastStmt = nil
}
case 9:
yyDollar = yyS[yypt-0 : yypt+1]
//line build/parse.y:276
{
yyVAL.exprs = nil
yyVAL.lastStmt = nil
}
case 10:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:281
{
// If this statement follows a comment block,
// attach the comments to the statement.
if cb, ok := yyDollar[1].lastStmt.(*CommentBlock); ok {
yyVAL.exprs = append(yyDollar[1].exprs[:len(yyDollar[1].exprs)-1], yyDollar[2].exprs...)
yyDollar[2].exprs[0].Comment().Before = cb.After
yyVAL.lastStmt = yyDollar[2].lastStmt
break
}
// Otherwise add to list.
yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[2].exprs...)
yyVAL.lastStmt = yyDollar[2].lastStmt
// Consider this input:
//
// foo()
// # bar
// baz()
//
// If we've just parsed baz(), the # bar is attached to
// foo() as an After comment. Make it a Before comment
// for baz() instead.
if x := yyDollar[1].lastStmt; x != nil {
com := x.Comment()
// stmt is never empty
yyDollar[2].exprs[0].Comment().Before = com.After
com.After = nil
}
}
case 11:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:312
{
// Blank line; sever last rule from future comments.
yyVAL.exprs = yyDollar[1].exprs
yyVAL.lastStmt = nil
}
case 12:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:318
{
yyVAL.exprs = yyDollar[1].exprs
yyVAL.lastStmt = yyDollar[1].lastStmt
if yyVAL.lastStmt == nil {
cb := &CommentBlock{Start: yyDollar[2].pos}
yyVAL.exprs = append(yyVAL.exprs, cb)
yyVAL.lastStmt = cb
}
com := yyVAL.lastStmt.Comment()
com.After = append(com.After, Comment{Start: yyDollar[2].pos, Token: yyDollar[2].tok})
}
case 13:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:332
{
yyVAL.exprs = yyDollar[1].exprs
yyVAL.lastStmt = yyDollar[1].exprs[len(yyDollar[1].exprs)-1]
}
case 14:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:337
{
yyVAL.exprs = []Expr{yyDollar[1].expr}
yyVAL.lastStmt = yyDollar[1].expr
if cbs := extractTrailingComments(yyDollar[1].expr); len(cbs) > 0 {
yyVAL.exprs = append(yyVAL.exprs, cbs...)
yyVAL.lastStmt = cbs[len(cbs)-1]
if yyDollar[1].lastStmt == nil {
yyVAL.lastStmt = nil
}
}
}
case 15:
yyDollar = yyS[yypt-5 : yypt+1]
//line build/parse.y:351
{
yyVAL.def_header = &DefStmt{
Function: Function{
StartPos: yyDollar[1].pos,
Params: yyDollar[4].exprs,
},
Name: yyDollar[2].tok,
ForceCompact: forceCompact(yyDollar[3].pos, yyDollar[4].exprs, yyDollar[5].pos),
ForceMultiLine: forceMultiLine(yyDollar[3].pos, yyDollar[4].exprs, yyDollar[5].pos),
}
}
case 17:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:366
{
yyDollar[1].def_header.Type = yyDollar[3].expr
yyVAL.def_header = yyDollar[1].def_header
}
case 18:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:373
{
yyDollar[1].def_header.Function.Body = yyDollar[3].exprs
yyDollar[1].def_header.ColonPos = yyDollar[2].pos
yyVAL.expr = yyDollar[1].def_header
yyVAL.lastStmt = yyDollar[3].lastStmt
}
case 19:
yyDollar = yyS[yypt-6 : yypt+1]
//line build/parse.y:380
{
yyVAL.expr = &ForStmt{
For: yyDollar[1].pos,
Vars: yyDollar[2].expr,
X: yyDollar[4].expr,
Body: yyDollar[6].exprs,
}
yyVAL.lastStmt = yyDollar[6].lastStmt
}
case 20:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:390
{
yyVAL.expr = yyDollar[1].ifstmt
yyVAL.lastStmt = yyDollar[1].lastStmt
}
case 21:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:398
{
yyVAL.ifstmt = &IfStmt{
If: yyDollar[1].pos,
Cond: yyDollar[2].expr,
True: yyDollar[4].exprs,
}
yyVAL.lastStmt = yyDollar[4].lastStmt
}
case 22:
yyDollar = yyS[yypt-5 : yypt+1]
//line build/parse.y:407
{
yyVAL.ifstmt = yyDollar[1].ifstmt
inner := yyDollar[1].ifstmt
for len(inner.False) == 1 {
inner = inner.False[0].(*IfStmt)
}
inner.ElsePos = End{Pos: yyDollar[2].pos}
inner.False = []Expr{
&IfStmt{
If: yyDollar[2].pos,
Cond: yyDollar[3].expr,
True: yyDollar[5].exprs,
},
}
yyVAL.lastStmt = yyDollar[5].lastStmt
}
case 24:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:428
{
yyVAL.ifstmt = yyDollar[1].ifstmt
inner := yyDollar[1].ifstmt
for len(inner.False) == 1 {
inner = inner.False[0].(*IfStmt)
}
inner.ElsePos = End{Pos: yyDollar[2].pos}
inner.False = yyDollar[4].exprs
yyVAL.lastStmt = yyDollar[4].lastStmt
}
case 27:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:445
{
yyVAL.exprs = append([]Expr{yyDollar[1].expr}, yyDollar[2].exprs...)
yyVAL.lastStmt = yyVAL.exprs[len(yyVAL.exprs)-1]
}
case 28:
yyDollar = yyS[yypt-0 : yypt+1]
//line build/parse.y:451
{
yyVAL.exprs = []Expr{}
}
case 29:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:455
{
yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
}
case 31:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:462
{
yyVAL.expr = &ReturnStmt{
Return: yyDollar[1].pos,
Result: yyDollar[2].expr,
}
}
case 32:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:469
{
yyVAL.expr = &ReturnStmt{
Return: yyDollar[1].pos,
}
}
case 33:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:474
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 34:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:475
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 35:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:477
{
yyVAL.expr = &BranchStmt{
Token: yyDollar[1].tok,
TokenPos: yyDollar[1].pos,
}
}
case 36:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:484
{
yyVAL.expr = &BranchStmt{
Token: yyDollar[1].tok,
TokenPos: yyDollar[1].pos,
}
}
case 37:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:491
{
yyVAL.expr = &BranchStmt{
Token: yyDollar[1].tok,
TokenPos: yyDollar[1].pos,
}
}
case 42:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:505
{
yyVAL.expr = yyDollar[1].string
}
case 43:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:509
{
yyVAL.expr = &DotExpr{
X: yyDollar[1].expr,
Dot: yyDollar[2].pos,
NamePos: yyDollar[3].pos,
Name: yyDollar[3].tok,
}
}
case 44:
yyDollar = yyS[yypt-8 : yypt+1]
//line build/parse.y:518
{
load := &LoadStmt{
Load: yyDollar[1].pos,
Module: yyDollar[4].string,
Rparen: End{Pos: yyDollar[8].pos},
ForceCompact: yyDollar[2].pos.Line == yyDollar[8].pos.Line,
}
for _, arg := range yyDollar[6].loadargs {
load.From = append(load.From, &arg.from)
load.To = append(load.To, &arg.to)
}
yyVAL.expr = load
}
case 45:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:532
{
yyVAL.expr = &CallExpr{
X: yyDollar[1].expr,
ListStart: yyDollar[2].pos,
List: yyDollar[3].exprs,
End: End{Pos: yyDollar[4].pos},
ForceCompact: forceCompact(yyDollar[2].pos, yyDollar[3].exprs, yyDollar[4].pos),
ForceMultiLine: forceMultiLine(yyDollar[2].pos, yyDollar[3].exprs, yyDollar[4].pos),
}
}
case 46:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:543
{
yyVAL.expr = &IndexExpr{
X: yyDollar[1].expr,
IndexStart: yyDollar[2].pos,
Y: yyDollar[3].expr,
End: yyDollar[4].pos,
}
}
case 47:
yyDollar = yyS[yypt-6 : yypt+1]
//line build/parse.y:552
{
yyVAL.expr = &SliceExpr{
X: yyDollar[1].expr,
SliceStart: yyDollar[2].pos,
From: yyDollar[3].expr,
FirstColon: yyDollar[4].pos,
To: yyDollar[5].expr,
End: yyDollar[6].pos,
}
}
case 48:
yyDollar = yyS[yypt-8 : yypt+1]
//line build/parse.y:563
{
yyVAL.expr = &SliceExpr{
X: yyDollar[1].expr,
SliceStart: yyDollar[2].pos,
From: yyDollar[3].expr,
FirstColon: yyDollar[4].pos,
To: yyDollar[5].expr,
SecondColon: yyDollar[6].pos,
Step: yyDollar[7].expr,
End: yyDollar[8].pos,
}
}
case 49:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:576
{
yyVAL.expr = &ListExpr{
Start: yyDollar[1].pos,
List: yyDollar[2].exprs,
End: End{Pos: yyDollar[3].pos},
ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos),
}
}
case 50:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:585
{
yyVAL.expr = &Comprehension{
Curly: false,
Lbrack: yyDollar[1].pos,
Body: yyDollar[2].expr,
Clauses: yyDollar[3].exprs,
End: End{Pos: yyDollar[4].pos},
ForceMultiLine: forceMultiLineComprehension(yyDollar[1].pos, yyDollar[2].expr, yyDollar[3].exprs, yyDollar[4].pos),
}
}
case 51:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:596
{
yyVAL.expr = &Comprehension{
Curly: true,
Lbrack: yyDollar[1].pos,
Body: yyDollar[2].kv,
Clauses: yyDollar[3].exprs,
End: End{Pos: yyDollar[4].pos},
ForceMultiLine: forceMultiLineComprehension(yyDollar[1].pos, yyDollar[2].kv, yyDollar[3].exprs, yyDollar[4].pos),
}
}
case 52:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:607
{
exprValues := make([]Expr, 0, len(yyDollar[2].kvs))
for _, kv := range yyDollar[2].kvs {
exprValues = append(exprValues, Expr(kv))
}
yyVAL.expr = &DictExpr{
Start: yyDollar[1].pos,
List: yyDollar[2].kvs,
End: End{Pos: yyDollar[3].pos},
ForceMultiLine: forceMultiLine(yyDollar[1].pos, exprValues, yyDollar[3].pos),
}
}
case 53:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:620
{
yyVAL.expr = &SetExpr{
Start: yyDollar[1].pos,
List: yyDollar[2].exprs,
End: End{Pos: yyDollar[4].pos},
ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[4].pos),
}
}
case 54:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:629
{
if len(yyDollar[2].exprs) == 1 && yyDollar[2].comma.Line == 0 {
// Just a parenthesized expression, not a tuple.
yyVAL.expr = &ParenExpr{
Start: yyDollar[1].pos,
X: yyDollar[2].exprs[0],
End: End{Pos: yyDollar[3].pos},
ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos),
}
} else {
yyVAL.expr = &TupleExpr{
Start: yyDollar[1].pos,
List: yyDollar[2].exprs,
End: End{Pos: yyDollar[3].pos},
ForceCompact: forceCompact(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos),
ForceMultiLine: forceMultiLine(yyDollar[1].pos, yyDollar[2].exprs, yyDollar[3].pos),
}
}
}
case 55:
yyDollar = yyS[yypt-0 : yypt+1]
//line build/parse.y:650
{
yyVAL.exprs = nil
}
case 56:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:654
{
yyVAL.exprs = yyDollar[1].exprs
}
case 57:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:660
{
yyVAL.exprs = []Expr{yyDollar[2].expr}
}
case 58:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:664
{
yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
}
case 60:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:671
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 61:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:675
{
yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
}
case 62:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:679
{
yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
}
case 63:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:684
{
yyVAL.loadargs = []*struct {
from Ident
to Ident
}{yyDollar[1].loadarg}
}
case 64:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:688
{
yyDollar[1].loadargs = append(yyDollar[1].loadargs, yyDollar[3].loadarg)
yyVAL.loadargs = yyDollar[1].loadargs
}
case 65:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:694
{
start := yyDollar[1].string.Start.add("'")
if yyDollar[1].string.TripleQuote {
start = start.add("''")
}
yyVAL.loadarg = &struct {
from Ident
to Ident
}{
from: Ident{
Name: yyDollar[1].string.Value,
NamePos: start,
},
to: Ident{
Name: yyDollar[1].string.Value,
NamePos: start,
},
}
}
case 66:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:711
{
start := yyDollar[3].string.Start.add("'")
if yyDollar[3].string.TripleQuote {
start = start.add("''")
}
yyVAL.loadarg = &struct {
from Ident
to Ident
}{
from: Ident{
Name: yyDollar[3].string.Value,
NamePos: start,
},
to: *yyDollar[1].expr.(*Ident),
}
}
case 67:
yyDollar = yyS[yypt-0 : yypt+1]
//line build/parse.y:726
{
yyVAL.exprs = nil
}
case 68:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:730
{
yyVAL.exprs = yyDollar[1].exprs
}
case 69:
yyDollar = yyS[yypt-0 : yypt+1]
//line build/parse.y:735
{
yyVAL.exprs = nil
}
case 70:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:739
{
yyVAL.exprs = yyDollar[1].exprs
}
case 71:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:745
{
yyVAL.exprs = []Expr{yyDollar[1].expr}
}
case 72:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:749
{
yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
}
case 73:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:756
{
yyVAL.exprs = []Expr{yyDollar[1].expr}
}
case 74:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:760
{
yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
}
case 76:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:767
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 77:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:771
{
yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
}
case 78:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:775
{
yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, nil)
}
case 79:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:779
{
yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
}
case 81:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:788
{
yyVAL.expr = typed(yyDollar[1].expr, yyDollar[3].expr)
}
case 82:
yyDollar = yyS[yypt-5 : yypt+1]
//line build/parse.y:792
{
yyVAL.expr = binary(typed(yyDollar[1].expr, yyDollar[3].expr), yyDollar[4].pos, yyDollar[4].tok, yyDollar[5].expr)
}
case 83:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:796
{
yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, typed(yyDollar[2].expr, yyDollar[4].expr))
}
case 84:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:800
{
yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, typed(yyDollar[2].expr, yyDollar[4].expr))
}
case 86:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:807
{
tuple, ok := yyDollar[1].expr.(*TupleExpr)
if !ok || !tuple.NoBrackets {
tuple = &TupleExpr{
List: []Expr{yyDollar[1].expr},
NoBrackets: true,
ForceCompact: true,
ForceMultiLine: false,
}
}
tuple.List = append(tuple.List, yyDollar[3].expr)
yyVAL.expr = tuple
}
case 87:
yyDollar = yyS[yypt-0 : yypt+1]
//line build/parse.y:822
{
yyVAL.expr = nil
}
case 90:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:830
{
yyVAL.expr = &LambdaExpr{
Function: Function{
StartPos: yyDollar[1].pos,
Params: yyDollar[2].exprs,
Body: []Expr{yyDollar[4].expr},
},
}
}
case 91:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:839
{
yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
}
case 92:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:840
{
yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
}
case 93:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:841
{
yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
}
case 94:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:842
{
yyVAL.expr = unary(yyDollar[1].pos, yyDollar[1].tok, yyDollar[2].expr)
}
case 95:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:843
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 96:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:844
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 97:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:845
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 98:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:846
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 99:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:847
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 100:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:848
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 101:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:849
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 102:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:850
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 103:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:851
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 104:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:852
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 105:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:853
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 106:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:854
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 107:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:855
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 108:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:856
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, "not in", yyDollar[4].expr)
}
case 109:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:857
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 110:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:858
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 111:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:859
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 112:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:860
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 113:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:861
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 114:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:862
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 115:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:863
{
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
case 116:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:865
{
if b, ok := yyDollar[3].expr.(*UnaryExpr); ok && b.Op == "not" {
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, "is not", b.X)
} else {
yyVAL.expr = binary(yyDollar[1].expr, yyDollar[2].pos, yyDollar[2].tok, yyDollar[3].expr)
}
}
case 117:
yyDollar = yyS[yypt-5 : yypt+1]
//line build/parse.y:873
{
yyVAL.expr = &ConditionalExpr{
Then: yyDollar[1].expr,
IfStart: yyDollar[2].pos,
Test: yyDollar[3].expr,
ElseStart: yyDollar[4].pos,
Else: yyDollar[5].expr,
}
}
case 118:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:885
{
yyVAL.exprs = []Expr{yyDollar[1].expr}
}
case 119:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:889
{
yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[3].expr)
}
case 120:
yyDollar = yyS[yypt-0 : yypt+1]
//line build/parse.y:894
{
yyVAL.expr = nil
}
case 122:
yyDollar = yyS[yypt-0 : yypt+1]
//line build/parse.y:900
{
yyVAL.exprs, yyVAL.comma = nil, Position{}
}
case 123:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:904
{
yyVAL.exprs, yyVAL.comma = yyDollar[1].exprs, yyDollar[2].pos
}
case 124:
yyDollar = yyS[yypt-0 : yypt+1]
//line build/parse.y:914
{
yyVAL.pos = Position{}
}
case 127:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:925
{
yyVAL.pos = yyDollar[1].pos
}
case 128:
yyDollar = yyS[yypt-0 : yypt+1]
//line build/parse.y:933
{
yyVAL.pos = Position{}
}
case 130:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:940
{
yyVAL.kv = &KeyValueExpr{
Key: yyDollar[1].expr,
Colon: yyDollar[2].pos,
Value: yyDollar[3].expr,
}
}
case 131:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:950
{
yyVAL.kvs = []*KeyValueExpr{yyDollar[1].kv}
}
case 132:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:954
{
yyVAL.kvs = append(yyDollar[1].kvs, yyDollar[3].kv)
}
case 133:
yyDollar = yyS[yypt-0 : yypt+1]
//line build/parse.y:959
{
yyVAL.kvs = nil
}
case 134:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:963
{
yyVAL.kvs = yyDollar[1].kvs
}
case 135:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:967
{
yyVAL.kvs = yyDollar[1].kvs
}
case 137:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:974
{
tuple, ok := yyDollar[1].expr.(*TupleExpr)
if !ok || !tuple.NoBrackets {
tuple = &TupleExpr{
List: []Expr{yyDollar[1].expr},
NoBrackets: true,
ForceCompact: true,
ForceMultiLine: false,
}
}
tuple.List = append(tuple.List, yyDollar[3].expr)
yyVAL.expr = tuple
}
case 138:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:990
{
yyVAL.string = &StringExpr{
Start: yyDollar[1].pos,
Value: yyDollar[1].str,
TripleQuote: yyDollar[1].triple,
End: yyDollar[1].pos.add(yyDollar[1].tok),
Token: yyDollar[1].tok,
}
}
case 139:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:1002
{
yyVAL.expr = &Ident{NamePos: yyDollar[1].pos, Name: yyDollar[1].tok}
}
case 140:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:1008
{
yyVAL.expr = &LiteralExpr{Start: yyDollar[1].pos, Token: yyDollar[1].tok + "." + yyDollar[3].tok}
}
case 141:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:1012
{
yyVAL.expr = &LiteralExpr{Start: yyDollar[1].pos, Token: yyDollar[1].tok + "."}
}
case 142:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:1016
{
yyVAL.expr = &LiteralExpr{Start: yyDollar[1].pos, Token: "." + yyDollar[2].tok}
}
case 143:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:1020
{
yyVAL.expr = &LiteralExpr{Start: yyDollar[1].pos, Token: yyDollar[1].tok}
}
case 144:
yyDollar = yyS[yypt-4 : yypt+1]
//line build/parse.y:1026
{
yyVAL.expr = &ForClause{
For: yyDollar[1].pos,
Vars: yyDollar[2].expr,
In: yyDollar[3].pos,
X: yyDollar[4].expr,
}
}
case 145:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:1037
{
yyVAL.exprs = []Expr{yyDollar[1].expr}
}
case 146:
yyDollar = yyS[yypt-3 : yypt+1]
//line build/parse.y:1041
{
yyVAL.exprs = append(yyDollar[1].exprs, &IfClause{
If: yyDollar[2].pos,
Cond: yyDollar[3].expr,
})
}
case 147:
yyDollar = yyS[yypt-1 : yypt+1]
//line build/parse.y:1050
{
yyVAL.exprs = yyDollar[1].exprs
}
case 148:
yyDollar = yyS[yypt-2 : yypt+1]
//line build/parse.y:1054
{
yyVAL.exprs = append(yyDollar[1].exprs, yyDollar[2].exprs...)
}
}
goto yystack /* stack new state and value */
}