github.com/jslyzt/glua@v0.0.0-20210819023911-4030c8e0234a/parse/parser.go (about) 1 //line parser.go.y:2 2 package parse 3 4 //line parser.go.y:2 5 import ( 6 __yyfmt__ "fmt" 7 8 "github.com/jslyzt/glua/ast" 9 ) 10 11 //line parser.go.y:34 12 type yySymType struct { 13 yys int 14 token ast.Token 15 16 stmts []ast.Stmt 17 stmt ast.Stmt 18 19 funcname *ast.FuncName 20 funcexpr *ast.FunctionExpr 21 22 exprlist []ast.Expr 23 expr ast.Expr 24 25 fieldlist []*ast.Field 26 field *ast.Field 27 fieldsep string 28 29 namelist []string 30 parlist *ast.ParList 31 } 32 33 const TAnd = 57346 34 const TBreak = 57347 35 const TDo = 57348 36 const TElse = 57349 37 const TElseIf = 57350 38 const TEnd = 57351 39 const TFalse = 57352 40 const TFor = 57353 41 const TFunction = 57354 42 const TIf = 57355 43 const TIn = 57356 44 const TLocal = 57357 45 const TNil = 57358 46 const TNot = 57359 47 const TOr = 57360 48 const TReturn = 57361 49 const TRepeat = 57362 50 const TThen = 57363 51 const TTrue = 57364 52 const TUntil = 57365 53 const TWhile = 57366 54 const TEqeq = 57367 55 const TNeq = 57368 56 const TLte = 57369 57 const TGte = 57370 58 const T2Comma = 57371 59 const T3Comma = 57372 60 const TIdent = 57373 61 const TNumber = 57374 62 const TString = 57375 63 const UNARY = 57376 64 65 var yyToknames = []string{ 66 "TAnd", 67 "TBreak", 68 "TDo", 69 "TElse", 70 "TElseIf", 71 "TEnd", 72 "TFalse", 73 "TFor", 74 "TFunction", 75 "TIf", 76 "TIn", 77 "TLocal", 78 "TNil", 79 "TNot", 80 "TOr", 81 "TReturn", 82 "TRepeat", 83 "TThen", 84 "TTrue", 85 "TUntil", 86 "TWhile", 87 "TEqeq", 88 "TNeq", 89 "TLte", 90 "TGte", 91 "T2Comma", 92 "T3Comma", 93 "TIdent", 94 "TNumber", 95 "TString", 96 " {", 97 " (", 98 " >", 99 " <", 100 " +", 101 " -", 102 " *", 103 " /", 104 " %", 105 "UNARY", 106 " ^", 107 } 108 var yyStatenames = []string{} 109 110 const yyEofCode = 1 111 const yyErrCode = 2 112 const yyMaxDepth = 200 113 114 //line parser.go.y:514 115 func TokenName(c int) string { 116 if c >= TAnd && c-TAnd < len(yyToknames) { 117 if yyToknames[c-TAnd] != "" { 118 return yyToknames[c-TAnd] 119 } 120 } 121 return string([]byte{byte(c)}) 122 } 123 124 //line yacctab:1 125 var yyExca = []int{ 126 -1, 1, 127 1, -1, 128 -2, 0, 129 -1, 17, 130 46, 31, 131 47, 31, 132 -2, 68, 133 -1, 93, 134 46, 32, 135 47, 32, 136 -2, 68, 137 } 138 139 const ( 140 yyNprod = 95 141 yyLast = 579 142 yyPrivate = 57344 143 ) 144 145 var ( 146 yyTokenNames []string 147 yyStates []string 148 ) 149 150 var yyAct = []int{ 151 152 24, 88, 50, 23, 45, 84, 56, 65, 137, 153, 153 136, 113, 52, 142, 54, 53, 33, 134, 65, 132, 154 62, 63, 32, 61, 108, 109, 48, 111, 106, 41, 155 42, 105, 49, 155, 166, 81, 82, 83, 138, 104, 156 22, 91, 131, 80, 95, 92, 162, 74, 48, 85, 157 150, 99, 165, 148, 49, 149, 75, 76, 77, 78, 158 79, 67, 80, 107, 106, 148, 114, 115, 116, 117, 159 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 160 128, 129, 72, 73, 71, 70, 74, 65, 39, 40, 161 47, 139, 133, 68, 69, 75, 76, 77, 78, 79, 162 60, 80, 141, 144, 143, 146, 145, 31, 67, 147, 163 9, 48, 110, 97, 48, 152, 151, 49, 38, 62, 164 49, 17, 66, 77, 78, 79, 96, 80, 59, 72, 165 73, 71, 70, 74, 154, 102, 91, 156, 55, 157, 166 68, 69, 75, 76, 77, 78, 79, 21, 80, 187, 167 94, 20, 26, 184, 37, 179, 163, 112, 25, 35, 168 178, 93, 170, 172, 27, 171, 164, 173, 19, 159, 169 175, 174, 29, 89, 28, 39, 40, 20, 182, 181, 170 100, 34, 135, 183, 67, 39, 40, 47, 186, 64, 171 51, 1, 90, 87, 36, 130, 86, 30, 66, 18, 172 46, 44, 43, 8, 58, 72, 73, 71, 70, 74, 173 57, 67, 168, 169, 167, 3, 68, 69, 75, 76, 174 77, 78, 79, 160, 80, 66, 4, 2, 0, 0, 175 0, 158, 72, 73, 71, 70, 74, 0, 0, 0, 176 0, 0, 0, 68, 69, 75, 76, 77, 78, 79, 177 26, 80, 37, 0, 0, 0, 25, 35, 140, 0, 178 0, 0, 27, 0, 0, 0, 0, 0, 0, 0, 179 29, 21, 28, 39, 40, 20, 26, 0, 37, 34, 180 0, 0, 25, 35, 0, 0, 0, 0, 27, 0, 181 0, 0, 36, 98, 0, 0, 29, 89, 28, 39, 182 40, 20, 26, 0, 37, 34, 0, 0, 25, 35, 183 0, 0, 0, 0, 27, 67, 90, 176, 36, 0, 184 0, 0, 29, 21, 28, 39, 40, 20, 0, 66, 185 0, 34, 0, 0, 0, 0, 72, 73, 71, 70, 186 74, 0, 67, 0, 36, 0, 0, 68, 69, 75, 187 76, 77, 78, 79, 0, 80, 66, 0, 177, 0, 188 0, 0, 0, 72, 73, 71, 70, 74, 0, 67, 189 0, 185, 0, 0, 68, 69, 75, 76, 77, 78, 190 79, 0, 80, 66, 0, 161, 0, 0, 0, 0, 191 72, 73, 71, 70, 74, 0, 67, 0, 0, 0, 192 0, 68, 69, 75, 76, 77, 78, 79, 0, 80, 193 66, 0, 0, 180, 0, 0, 0, 72, 73, 71, 194 70, 74, 0, 67, 0, 0, 0, 0, 68, 69, 195 75, 76, 77, 78, 79, 0, 80, 66, 0, 0, 196 103, 0, 0, 0, 72, 73, 71, 70, 74, 0, 197 67, 0, 101, 0, 0, 68, 69, 75, 76, 77, 198 78, 79, 0, 80, 66, 0, 0, 0, 0, 0, 199 0, 72, 73, 71, 70, 74, 0, 67, 0, 0, 200 0, 0, 68, 69, 75, 76, 77, 78, 79, 0, 201 80, 66, 0, 0, 0, 0, 0, 0, 72, 73, 202 71, 70, 74, 0, 0, 0, 0, 0, 0, 68, 203 69, 75, 76, 77, 78, 79, 0, 80, 72, 73, 204 71, 70, 74, 0, 0, 0, 0, 0, 0, 68, 205 69, 75, 76, 77, 78, 79, 0, 80, 7, 10, 206 0, 0, 0, 0, 14, 15, 13, 0, 16, 0, 207 0, 0, 6, 12, 0, 0, 0, 11, 0, 0, 208 0, 0, 0, 0, 21, 0, 0, 0, 20, 0, 209 0, 0, 0, 0, 0, 0, 0, 0, 5, 210 } 211 var yyPact = []int{ 212 213 -1000, -1000, 533, -5, -1000, -1000, 292, -1000, -17, 152, 214 -1000, 292, -1000, 292, 107, 97, 88, -1000, -1000, -1000, 215 292, -1000, -1000, -29, 473, -1000, -1000, -1000, -1000, -1000, 216 -1000, 152, -1000, -1000, 292, 292, 292, 14, -1000, -1000, 217 142, 292, 116, 292, 95, -1000, 82, 240, -1000, -1000, 218 171, -1000, 446, 112, 419, -7, 17, 14, -24, -1000, 219 81, -19, -1000, 104, -42, 292, 292, 292, 292, 292, 220 292, 292, 292, 292, 292, 292, 292, 292, 292, 292, 221 292, -1, -1, -1, -1000, -11, -1000, -37, -1000, -8, 222 292, 473, -29, -1000, 152, 207, -1000, 55, -1000, -40, 223 -1000, -1000, 292, -1000, 292, 292, 34, -1000, 24, 19, 224 14, 292, -1000, -1000, 473, 57, 493, 18, 18, 18, 225 18, 18, 18, 18, 83, 83, -1, -1, -1, -1, 226 -44, -1000, -1000, -14, -1000, 266, -1000, -1000, 292, 180, 227 -1000, -1000, -1000, 160, 473, -1000, 338, 40, -1000, -1000, 228 -1000, -1000, -29, -1000, 157, 22, -1000, 473, -12, -1000, 229 205, 292, -1000, 154, -1000, -1000, 292, -1000, -1000, 292, 230 311, 151, -1000, 473, 146, 392, -1000, 292, -1000, -1000, 231 -1000, 144, 365, -1000, -1000, -1000, 140, -1000, 232 } 233 var yyPgo = []int{ 234 235 0, 190, 227, 2, 226, 223, 215, 210, 204, 203, 236 118, 6, 3, 0, 22, 107, 168, 199, 4, 197, 237 5, 195, 16, 193, 1, 182, 238 } 239 var yyR1 = []int{ 240 241 0, 1, 1, 1, 2, 2, 2, 3, 4, 4, 242 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 243 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 244 8, 9, 9, 10, 10, 10, 11, 11, 12, 12, 245 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 246 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 247 13, 13, 13, 13, 13, 13, 13, 14, 15, 15, 248 15, 15, 17, 16, 16, 18, 18, 18, 18, 19, 249 20, 20, 21, 21, 21, 22, 22, 23, 23, 23, 250 24, 24, 24, 25, 25, 251 } 252 var yyR2 = []int{ 253 254 0, 1, 2, 3, 0, 2, 2, 1, 3, 1, 255 3, 5, 4, 6, 8, 9, 11, 7, 3, 4, 256 4, 2, 0, 5, 1, 2, 1, 1, 3, 1, 257 3, 1, 3, 1, 4, 3, 1, 3, 1, 3, 258 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 259 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 260 3, 3, 3, 3, 2, 2, 2, 1, 1, 1, 261 1, 3, 3, 2, 4, 2, 3, 1, 1, 2, 262 5, 4, 1, 1, 3, 2, 3, 1, 3, 2, 263 3, 5, 1, 1, 1, 264 } 265 var yyChk = []int{ 266 267 -1000, -1, -2, -6, -4, 45, 19, 5, -9, -15, 268 6, 24, 20, 13, 11, 12, 15, -10, -17, -16, 269 35, 31, 45, -12, -13, 16, 10, 22, 32, 30, 270 -19, -15, -14, -22, 39, 17, 52, 12, -10, 33, 271 34, 46, 47, 50, 49, -18, 48, 35, -22, -14, 272 -3, -1, -13, -3, -13, 31, -11, -7, -8, 31, 273 12, -11, 31, -13, -16, 47, 18, 4, 36, 37, 274 28, 27, 25, 26, 29, 38, 39, 40, 41, 42, 275 44, -13, -13, -13, -20, 35, 54, -23, -24, 31, 276 50, -13, -12, -10, -15, -13, 31, 31, 53, -12, 277 9, 6, 23, 21, 46, 14, 47, -20, 48, 49, 278 31, 46, 53, 53, -13, -13, -13, -13, -13, -13, 279 -13, -13, -13, -13, -13, -13, -13, -13, -13, -13, 280 -21, 53, 30, -11, 54, -25, 47, 45, 46, -13, 281 51, -18, 53, -3, -13, -3, -13, -12, 31, 31, 282 31, -20, -12, 53, -3, 47, -24, -13, 51, 9, 283 -5, 47, 6, -3, 9, 30, 46, 9, 7, 8, 284 -13, -3, 9, -13, -3, -13, 6, 47, 9, 9, 285 21, -3, -13, -3, 9, 6, -3, 9, 286 } 287 var yyDef = []int{ 288 289 4, -2, 1, 2, 5, 6, 24, 26, 0, 9, 290 4, 0, 4, 0, 0, 0, 0, -2, 69, 70, 291 0, 33, 3, 25, 38, 40, 41, 42, 43, 44, 292 45, 46, 47, 48, 0, 0, 0, 0, 68, 67, 293 0, 0, 0, 0, 0, 73, 0, 0, 77, 78, 294 0, 7, 0, 0, 0, 36, 0, 0, 27, 29, 295 0, 21, 36, 0, 70, 0, 0, 0, 0, 0, 296 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 297 0, 64, 65, 66, 79, 0, 85, 0, 87, 33, 298 0, 92, 8, -2, 0, 0, 35, 0, 75, 0, 299 10, 4, 0, 4, 0, 0, 0, 18, 0, 0, 300 0, 0, 71, 72, 39, 49, 50, 51, 52, 53, 301 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 302 0, 4, 82, 83, 86, 89, 93, 94, 0, 0, 303 34, 74, 76, 0, 12, 22, 0, 0, 37, 28, 304 30, 19, 20, 4, 0, 0, 88, 90, 0, 11, 305 0, 0, 4, 0, 81, 84, 0, 13, 4, 0, 306 0, 0, 80, 91, 0, 0, 4, 0, 17, 14, 307 4, 0, 0, 23, 15, 4, 0, 16, 308 } 309 var yyTok1 = []int{ 310 311 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 312 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 313 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 314 3, 3, 3, 3, 3, 52, 3, 42, 3, 3, 315 35, 53, 40, 38, 47, 39, 49, 41, 3, 3, 316 3, 3, 3, 3, 3, 3, 3, 3, 48, 45, 317 37, 46, 36, 3, 3, 3, 3, 3, 3, 3, 318 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 319 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 320 3, 50, 3, 51, 44, 3, 3, 3, 3, 3, 321 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 322 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 323 3, 3, 3, 34, 3, 54, 324 } 325 var yyTok2 = []int{ 326 327 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 328 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 329 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 330 32, 33, 43, 331 } 332 var yyTok3 = []int{ 333 0, 334 } 335 336 //line yaccpar:1 337 338 /* parser for yacc output */ 339 340 var yyDebug = 0 341 342 type yyLexer interface { 343 Lex(lval *yySymType) int 344 Error(s string) 345 } 346 347 const yyFlag = -1000 348 349 func yyTokname(c int) string { 350 // 4 is TOKSTART above 351 if c >= 4 && c-4 < len(yyToknames) { 352 if yyToknames[c-4] != "" { 353 return yyToknames[c-4] 354 } 355 } 356 return __yyfmt__.Sprintf("tok-%v", c) 357 } 358 359 func yyStatname(s int) string { 360 if s >= 0 && s < len(yyStatenames) { 361 if yyStatenames[s] != "" { 362 return yyStatenames[s] 363 } 364 } 365 return __yyfmt__.Sprintf("state-%v", s) 366 } 367 368 func yylex1(lex yyLexer, lval *yySymType) int { 369 c := 0 370 char := lex.Lex(lval) 371 if char <= 0 { 372 c = yyTok1[0] 373 goto out 374 } 375 if char < len(yyTok1) { 376 c = yyTok1[char] 377 goto out 378 } 379 if char >= yyPrivate { 380 if char < yyPrivate+len(yyTok2) { 381 c = yyTok2[char-yyPrivate] 382 goto out 383 } 384 } 385 for i := 0; i < len(yyTok3); i += 2 { 386 c = yyTok3[i+0] 387 if c == char { 388 c = yyTok3[i+1] 389 goto out 390 } 391 } 392 393 out: 394 if c == 0 { 395 c = yyTok2[1] /* unknown char */ 396 } 397 if yyDebug >= 3 { 398 __yyfmt__.Printf("lex %s(%d)\n", yyTokname(c), uint(char)) 399 } 400 return c 401 } 402 403 func yyParse(yylex yyLexer) int { 404 var yyn int 405 var yylval yySymType 406 var yyVAL yySymType 407 yyS := make([]yySymType, yyMaxDepth) 408 409 Nerrs := 0 /* number of errors */ 410 Errflag := 0 /* error recovery flag */ 411 yystate := 0 412 yychar := -1 413 yyp := -1 414 goto yystack 415 416 ret0: 417 return 0 418 419 ret1: 420 return 1 421 422 yystack: 423 /* put a state and value onto the stack */ 424 if yyDebug >= 4 { 425 __yyfmt__.Printf("char %v in %v\n", yyTokname(yychar), yyStatname(yystate)) 426 } 427 428 yyp++ 429 if yyp >= len(yyS) { 430 nyys := make([]yySymType, len(yyS)*2) 431 copy(nyys, yyS) 432 yyS = nyys 433 } 434 yyS[yyp] = yyVAL 435 yyS[yyp].yys = yystate 436 437 yynewstate: 438 yyn = yyPact[yystate] 439 if yyn <= yyFlag { 440 goto yydefault /* simple state */ 441 } 442 if yychar < 0 { 443 yychar = yylex1(yylex, &yylval) 444 } 445 yyn += yychar 446 if yyn < 0 || yyn >= yyLast { 447 goto yydefault 448 } 449 yyn = yyAct[yyn] 450 if yyChk[yyn] == yychar { /* valid shift */ 451 yychar = -1 452 yyVAL = yylval 453 yystate = yyn 454 if Errflag > 0 { 455 Errflag-- 456 } 457 goto yystack 458 } 459 460 yydefault: 461 /* default state action */ 462 yyn = yyDef[yystate] 463 if yyn == -2 { 464 if yychar < 0 { 465 yychar = yylex1(yylex, &yylval) 466 } 467 468 /* look through exception table */ 469 xi := 0 470 for { 471 if yyExca[xi+0] == -1 && yyExca[xi+1] == yystate { 472 break 473 } 474 xi += 2 475 } 476 for xi += 2; ; xi += 2 { 477 yyn = yyExca[xi+0] 478 if yyn < 0 || yyn == yychar { 479 break 480 } 481 } 482 yyn = yyExca[xi+1] 483 if yyn < 0 { 484 goto ret0 485 } 486 } 487 if yyn == 0 { 488 /* error ... attempt to resume parsing */ 489 switch Errflag { 490 case 0: /* brand new error */ 491 yylex.Error("syntax error") 492 Nerrs++ 493 if yyDebug >= 1 { 494 __yyfmt__.Printf("%s", yyStatname(yystate)) 495 __yyfmt__.Printf(" saw %s\n", yyTokname(yychar)) 496 } 497 fallthrough 498 499 case 1, 2: /* incompletely recovered error ... try again */ 500 Errflag = 3 501 502 /* find a state where "error" is a legal shift action */ 503 for yyp >= 0 { 504 yyn = yyPact[yyS[yyp].yys] + yyErrCode 505 if yyn >= 0 && yyn < yyLast { 506 yystate = yyAct[yyn] /* simulate a shift of "error" */ 507 if yyChk[yystate] == yyErrCode { 508 goto yystack 509 } 510 } 511 512 /* the current p has no shift on "error", pop stack */ 513 if yyDebug >= 2 { 514 __yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys) 515 } 516 yyp-- 517 } 518 /* there is no state on the stack with an error shift ... abort */ 519 goto ret1 520 521 case 3: /* no shift yet; clobber input char */ 522 if yyDebug >= 2 { 523 __yyfmt__.Printf("error recovery discards %s\n", yyTokname(yychar)) 524 } 525 if yychar == yyEofCode { 526 goto ret1 527 } 528 yychar = -1 529 goto yynewstate /* try again in the same state */ 530 } 531 } 532 533 /* reduction by production yyn */ 534 if yyDebug >= 2 { 535 __yyfmt__.Printf("reduce %v in:\n\t%v\n", yyn, yyStatname(yystate)) 536 } 537 538 yynt := yyn 539 yypt := yyp 540 _ = yypt // guard against "declared and not used" 541 542 yyp -= yyR2[yyn] 543 yyVAL = yyS[yyp+1] 544 545 /* consult goto table to find next state */ 546 yyn = yyR1[yyn] 547 yyg := yyPgo[yyn] 548 yyj := yyg + yyS[yyp].yys + 1 549 550 if yyj >= yyLast { 551 yystate = yyAct[yyg] 552 } else { 553 yystate = yyAct[yyj] 554 if yyChk[yystate] != -yyn { 555 yystate = yyAct[yyg] 556 } 557 } 558 // dummy call; replaced with literal code 559 switch yynt { 560 561 case 1: 562 //line parser.go.y:73 563 { 564 yyVAL.stmts = yyS[yypt-0].stmts 565 if l, ok := yylex.(*Lexer); ok { 566 l.Stmts = yyVAL.stmts 567 } 568 } 569 case 2: 570 //line parser.go.y:79 571 { 572 yyVAL.stmts = append(yyS[yypt-1].stmts, yyS[yypt-0].stmt) 573 if l, ok := yylex.(*Lexer); ok { 574 l.Stmts = yyVAL.stmts 575 } 576 } 577 case 3: 578 //line parser.go.y:85 579 { 580 yyVAL.stmts = append(yyS[yypt-2].stmts, yyS[yypt-1].stmt) 581 if l, ok := yylex.(*Lexer); ok { 582 l.Stmts = yyVAL.stmts 583 } 584 } 585 case 4: 586 //line parser.go.y:93 587 { 588 yyVAL.stmts = []ast.Stmt{} 589 } 590 case 5: 591 //line parser.go.y:96 592 { 593 yyVAL.stmts = append(yyS[yypt-1].stmts, yyS[yypt-0].stmt) 594 } 595 case 6: 596 //line parser.go.y:99 597 { 598 yyVAL.stmts = yyS[yypt-1].stmts 599 } 600 case 7: 601 //line parser.go.y:104 602 { 603 yyVAL.stmts = yyS[yypt-0].stmts 604 } 605 case 8: 606 //line parser.go.y:109 607 { 608 yyVAL.stmt = &ast.AssignStmt{Lhs: yyS[yypt-2].exprlist, Rhs: yyS[yypt-0].exprlist} 609 yyVAL.stmt.SetLine(yyS[yypt-2].exprlist[0].Line()) 610 } 611 case 9: 612 //line parser.go.y:114 613 { 614 if _, ok := yyS[yypt-0].expr.(*ast.FuncCallExpr); !ok { 615 yylex.(*Lexer).Error("parse error") 616 } else { 617 yyVAL.stmt = &ast.FuncCallStmt{Expr: yyS[yypt-0].expr} 618 yyVAL.stmt.SetLine(yyS[yypt-0].expr.Line()) 619 } 620 } 621 case 10: 622 //line parser.go.y:122 623 { 624 yyVAL.stmt = &ast.DoBlockStmt{Stmts: yyS[yypt-1].stmts} 625 yyVAL.stmt.SetLine(yyS[yypt-2].token.Pos.Line) 626 yyVAL.stmt.SetLastLine(yyS[yypt-0].token.Pos.Line) 627 } 628 case 11: 629 //line parser.go.y:127 630 { 631 yyVAL.stmt = &ast.WhileStmt{Condition: yyS[yypt-3].expr, Stmts: yyS[yypt-1].stmts} 632 yyVAL.stmt.SetLine(yyS[yypt-4].token.Pos.Line) 633 yyVAL.stmt.SetLastLine(yyS[yypt-0].token.Pos.Line) 634 } 635 case 12: 636 //line parser.go.y:132 637 { 638 yyVAL.stmt = &ast.RepeatStmt{Condition: yyS[yypt-0].expr, Stmts: yyS[yypt-2].stmts} 639 yyVAL.stmt.SetLine(yyS[yypt-3].token.Pos.Line) 640 yyVAL.stmt.SetLastLine(yyS[yypt-0].expr.Line()) 641 } 642 case 13: 643 //line parser.go.y:137 644 { 645 yyVAL.stmt = &ast.IfStmt{Condition: yyS[yypt-4].expr, Then: yyS[yypt-2].stmts} 646 cur := yyVAL.stmt 647 for _, elseif := range yyS[yypt-1].stmts { 648 cur.(*ast.IfStmt).Else = []ast.Stmt{elseif} 649 cur = elseif 650 } 651 yyVAL.stmt.SetLine(yyS[yypt-5].token.Pos.Line) 652 yyVAL.stmt.SetLastLine(yyS[yypt-0].token.Pos.Line) 653 } 654 case 14: 655 //line parser.go.y:147 656 { 657 yyVAL.stmt = &ast.IfStmt{Condition: yyS[yypt-6].expr, Then: yyS[yypt-4].stmts} 658 cur := yyVAL.stmt 659 for _, elseif := range yyS[yypt-3].stmts { 660 cur.(*ast.IfStmt).Else = []ast.Stmt{elseif} 661 cur = elseif 662 } 663 cur.(*ast.IfStmt).Else = yyS[yypt-1].stmts 664 yyVAL.stmt.SetLine(yyS[yypt-7].token.Pos.Line) 665 yyVAL.stmt.SetLastLine(yyS[yypt-0].token.Pos.Line) 666 } 667 case 15: 668 //line parser.go.y:158 669 { 670 yyVAL.stmt = &ast.NumberForStmt{Name: yyS[yypt-7].token.Str, Init: yyS[yypt-5].expr, Limit: yyS[yypt-3].expr, Stmts: yyS[yypt-1].stmts} 671 yyVAL.stmt.SetLine(yyS[yypt-8].token.Pos.Line) 672 yyVAL.stmt.SetLastLine(yyS[yypt-0].token.Pos.Line) 673 } 674 case 16: 675 //line parser.go.y:163 676 { 677 yyVAL.stmt = &ast.NumberForStmt{Name: yyS[yypt-9].token.Str, Init: yyS[yypt-7].expr, Limit: yyS[yypt-5].expr, Step: yyS[yypt-3].expr, Stmts: yyS[yypt-1].stmts} 678 yyVAL.stmt.SetLine(yyS[yypt-10].token.Pos.Line) 679 yyVAL.stmt.SetLastLine(yyS[yypt-0].token.Pos.Line) 680 } 681 case 17: 682 //line parser.go.y:168 683 { 684 yyVAL.stmt = &ast.GenericForStmt{Names: yyS[yypt-5].namelist, Exprs: yyS[yypt-3].exprlist, Stmts: yyS[yypt-1].stmts} 685 yyVAL.stmt.SetLine(yyS[yypt-6].token.Pos.Line) 686 yyVAL.stmt.SetLastLine(yyS[yypt-0].token.Pos.Line) 687 } 688 case 18: 689 //line parser.go.y:173 690 { 691 yyVAL.stmt = &ast.FuncDefStmt{Name: yyS[yypt-1].funcname, Func: yyS[yypt-0].funcexpr} 692 yyVAL.stmt.SetLine(yyS[yypt-2].token.Pos.Line) 693 yyVAL.stmt.SetLastLine(yyS[yypt-0].funcexpr.LastLine()) 694 } 695 case 19: 696 //line parser.go.y:178 697 { 698 yyVAL.stmt = &ast.LocalAssignStmt{Names: []string{yyS[yypt-1].token.Str}, Exprs: []ast.Expr{yyS[yypt-0].funcexpr}} 699 yyVAL.stmt.SetLine(yyS[yypt-3].token.Pos.Line) 700 yyVAL.stmt.SetLastLine(yyS[yypt-0].funcexpr.LastLine()) 701 } 702 case 20: 703 //line parser.go.y:183 704 { 705 yyVAL.stmt = &ast.LocalAssignStmt{Names: yyS[yypt-2].namelist, Exprs: yyS[yypt-0].exprlist} 706 yyVAL.stmt.SetLine(yyS[yypt-3].token.Pos.Line) 707 } 708 case 21: 709 //line parser.go.y:187 710 { 711 yyVAL.stmt = &ast.LocalAssignStmt{Names: yyS[yypt-0].namelist, Exprs: []ast.Expr{}} 712 yyVAL.stmt.SetLine(yyS[yypt-1].token.Pos.Line) 713 } 714 case 22: 715 //line parser.go.y:193 716 { 717 yyVAL.stmts = []ast.Stmt{} 718 } 719 case 23: 720 //line parser.go.y:196 721 { 722 yyVAL.stmts = append(yyS[yypt-4].stmts, &ast.IfStmt{Condition: yyS[yypt-2].expr, Then: yyS[yypt-0].stmts}) 723 yyVAL.stmts[len(yyVAL.stmts)-1].SetLine(yyS[yypt-3].token.Pos.Line) 724 } 725 case 24: 726 //line parser.go.y:202 727 { 728 yyVAL.stmt = &ast.ReturnStmt{Exprs: nil} 729 yyVAL.stmt.SetLine(yyS[yypt-0].token.Pos.Line) 730 } 731 case 25: 732 //line parser.go.y:206 733 { 734 yyVAL.stmt = &ast.ReturnStmt{Exprs: yyS[yypt-0].exprlist} 735 yyVAL.stmt.SetLine(yyS[yypt-1].token.Pos.Line) 736 } 737 case 26: 738 //line parser.go.y:210 739 { 740 yyVAL.stmt = &ast.BreakStmt{} 741 yyVAL.stmt.SetLine(yyS[yypt-0].token.Pos.Line) 742 } 743 case 27: 744 //line parser.go.y:216 745 { 746 yyVAL.funcname = yyS[yypt-0].funcname 747 } 748 case 28: 749 //line parser.go.y:219 750 { 751 yyVAL.funcname = &ast.FuncName{Func: nil, Receiver: yyS[yypt-2].funcname.Func, Method: yyS[yypt-0].token.Str} 752 } 753 case 29: 754 //line parser.go.y:224 755 { 756 yyVAL.funcname = &ast.FuncName{Func: &ast.IdentExpr{Value: yyS[yypt-0].token.Str}} 757 yyVAL.funcname.Func.SetLine(yyS[yypt-0].token.Pos.Line) 758 } 759 case 30: 760 //line parser.go.y:228 761 { 762 key := &ast.StringExpr{Value: yyS[yypt-0].token.Str} 763 key.SetLine(yyS[yypt-0].token.Pos.Line) 764 fn := &ast.AttrGetExpr{Object: yyS[yypt-2].funcname.Func, Key: key} 765 fn.SetLine(yyS[yypt-0].token.Pos.Line) 766 yyVAL.funcname = &ast.FuncName{Func: fn} 767 } 768 case 31: 769 //line parser.go.y:237 770 { 771 yyVAL.exprlist = []ast.Expr{yyS[yypt-0].expr} 772 } 773 case 32: 774 //line parser.go.y:240 775 { 776 yyVAL.exprlist = append(yyS[yypt-2].exprlist, yyS[yypt-0].expr) 777 } 778 case 33: 779 //line parser.go.y:245 780 { 781 yyVAL.expr = &ast.IdentExpr{Value: yyS[yypt-0].token.Str} 782 yyVAL.expr.SetLine(yyS[yypt-0].token.Pos.Line) 783 } 784 case 34: 785 //line parser.go.y:249 786 { 787 yyVAL.expr = &ast.AttrGetExpr{Object: yyS[yypt-3].expr, Key: yyS[yypt-1].expr} 788 yyVAL.expr.SetLine(yyS[yypt-3].expr.Line()) 789 } 790 case 35: 791 //line parser.go.y:253 792 { 793 key := &ast.StringExpr{Value: yyS[yypt-0].token.Str} 794 key.SetLine(yyS[yypt-0].token.Pos.Line) 795 yyVAL.expr = &ast.AttrGetExpr{Object: yyS[yypt-2].expr, Key: key} 796 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 797 } 798 case 36: 799 //line parser.go.y:261 800 { 801 yyVAL.namelist = []string{yyS[yypt-0].token.Str} 802 } 803 case 37: 804 //line parser.go.y:264 805 { 806 yyVAL.namelist = append(yyS[yypt-2].namelist, yyS[yypt-0].token.Str) 807 } 808 case 38: 809 //line parser.go.y:269 810 { 811 yyVAL.exprlist = []ast.Expr{yyS[yypt-0].expr} 812 } 813 case 39: 814 //line parser.go.y:272 815 { 816 yyVAL.exprlist = append(yyS[yypt-2].exprlist, yyS[yypt-0].expr) 817 } 818 case 40: 819 //line parser.go.y:277 820 { 821 yyVAL.expr = &ast.NilExpr{} 822 yyVAL.expr.SetLine(yyS[yypt-0].token.Pos.Line) 823 } 824 case 41: 825 //line parser.go.y:281 826 { 827 yyVAL.expr = &ast.FalseExpr{} 828 yyVAL.expr.SetLine(yyS[yypt-0].token.Pos.Line) 829 } 830 case 42: 831 //line parser.go.y:285 832 { 833 yyVAL.expr = &ast.TrueExpr{} 834 yyVAL.expr.SetLine(yyS[yypt-0].token.Pos.Line) 835 } 836 case 43: 837 //line parser.go.y:289 838 { 839 yyVAL.expr = &ast.NumberExpr{Value: yyS[yypt-0].token.Str} 840 yyVAL.expr.SetLine(yyS[yypt-0].token.Pos.Line) 841 } 842 case 44: 843 //line parser.go.y:293 844 { 845 yyVAL.expr = &ast.Comma3Expr{} 846 yyVAL.expr.SetLine(yyS[yypt-0].token.Pos.Line) 847 } 848 case 45: 849 //line parser.go.y:297 850 { 851 yyVAL.expr = yyS[yypt-0].expr 852 } 853 case 46: 854 //line parser.go.y:300 855 { 856 yyVAL.expr = yyS[yypt-0].expr 857 } 858 case 47: 859 //line parser.go.y:303 860 { 861 yyVAL.expr = yyS[yypt-0].expr 862 } 863 case 48: 864 //line parser.go.y:306 865 { 866 yyVAL.expr = yyS[yypt-0].expr 867 } 868 case 49: 869 //line parser.go.y:309 870 { 871 yyVAL.expr = &ast.LogicalOpExpr{Lhs: yyS[yypt-2].expr, Operator: "or", Rhs: yyS[yypt-0].expr} 872 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 873 } 874 case 50: 875 //line parser.go.y:313 876 { 877 yyVAL.expr = &ast.LogicalOpExpr{Lhs: yyS[yypt-2].expr, Operator: "and", Rhs: yyS[yypt-0].expr} 878 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 879 } 880 case 51: 881 //line parser.go.y:317 882 { 883 yyVAL.expr = &ast.RelationalOpExpr{Lhs: yyS[yypt-2].expr, Operator: ">", Rhs: yyS[yypt-0].expr} 884 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 885 } 886 case 52: 887 //line parser.go.y:321 888 { 889 yyVAL.expr = &ast.RelationalOpExpr{Lhs: yyS[yypt-2].expr, Operator: "<", Rhs: yyS[yypt-0].expr} 890 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 891 } 892 case 53: 893 //line parser.go.y:325 894 { 895 yyVAL.expr = &ast.RelationalOpExpr{Lhs: yyS[yypt-2].expr, Operator: ">=", Rhs: yyS[yypt-0].expr} 896 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 897 } 898 case 54: 899 //line parser.go.y:329 900 { 901 yyVAL.expr = &ast.RelationalOpExpr{Lhs: yyS[yypt-2].expr, Operator: "<=", Rhs: yyS[yypt-0].expr} 902 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 903 } 904 case 55: 905 //line parser.go.y:333 906 { 907 yyVAL.expr = &ast.RelationalOpExpr{Lhs: yyS[yypt-2].expr, Operator: "==", Rhs: yyS[yypt-0].expr} 908 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 909 } 910 case 56: 911 //line parser.go.y:337 912 { 913 yyVAL.expr = &ast.RelationalOpExpr{Lhs: yyS[yypt-2].expr, Operator: "~=", Rhs: yyS[yypt-0].expr} 914 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 915 } 916 case 57: 917 //line parser.go.y:341 918 { 919 yyVAL.expr = &ast.StringConcatOpExpr{Lhs: yyS[yypt-2].expr, Rhs: yyS[yypt-0].expr} 920 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 921 } 922 case 58: 923 //line parser.go.y:345 924 { 925 yyVAL.expr = &ast.ArithmeticOpExpr{Lhs: yyS[yypt-2].expr, Operator: "+", Rhs: yyS[yypt-0].expr} 926 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 927 } 928 case 59: 929 //line parser.go.y:349 930 { 931 yyVAL.expr = &ast.ArithmeticOpExpr{Lhs: yyS[yypt-2].expr, Operator: "-", Rhs: yyS[yypt-0].expr} 932 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 933 } 934 case 60: 935 //line parser.go.y:353 936 { 937 yyVAL.expr = &ast.ArithmeticOpExpr{Lhs: yyS[yypt-2].expr, Operator: "*", Rhs: yyS[yypt-0].expr} 938 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 939 } 940 case 61: 941 //line parser.go.y:357 942 { 943 yyVAL.expr = &ast.ArithmeticOpExpr{Lhs: yyS[yypt-2].expr, Operator: "/", Rhs: yyS[yypt-0].expr} 944 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 945 } 946 case 62: 947 //line parser.go.y:361 948 { 949 yyVAL.expr = &ast.ArithmeticOpExpr{Lhs: yyS[yypt-2].expr, Operator: "%", Rhs: yyS[yypt-0].expr} 950 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 951 } 952 case 63: 953 //line parser.go.y:365 954 { 955 yyVAL.expr = &ast.ArithmeticOpExpr{Lhs: yyS[yypt-2].expr, Operator: "^", Rhs: yyS[yypt-0].expr} 956 yyVAL.expr.SetLine(yyS[yypt-2].expr.Line()) 957 } 958 case 64: 959 //line parser.go.y:369 960 { 961 yyVAL.expr = &ast.UnaryMinusOpExpr{Expr: yyS[yypt-0].expr} 962 yyVAL.expr.SetLine(yyS[yypt-0].expr.Line()) 963 } 964 case 65: 965 //line parser.go.y:373 966 { 967 yyVAL.expr = &ast.UnaryNotOpExpr{Expr: yyS[yypt-0].expr} 968 yyVAL.expr.SetLine(yyS[yypt-0].expr.Line()) 969 } 970 case 66: 971 //line parser.go.y:377 972 { 973 yyVAL.expr = &ast.UnaryLenOpExpr{Expr: yyS[yypt-0].expr} 974 yyVAL.expr.SetLine(yyS[yypt-0].expr.Line()) 975 } 976 case 67: 977 //line parser.go.y:383 978 { 979 yyVAL.expr = &ast.StringExpr{Value: yyS[yypt-0].token.Str} 980 yyVAL.expr.SetLine(yyS[yypt-0].token.Pos.Line) 981 } 982 case 68: 983 //line parser.go.y:389 984 { 985 yyVAL.expr = yyS[yypt-0].expr 986 } 987 case 69: 988 //line parser.go.y:392 989 { 990 yyVAL.expr = yyS[yypt-0].expr 991 } 992 case 70: 993 //line parser.go.y:395 994 { 995 yyVAL.expr = yyS[yypt-0].expr 996 } 997 case 71: 998 //line parser.go.y:398 999 { 1000 yyVAL.expr = yyS[yypt-1].expr 1001 yyVAL.expr.SetLine(yyS[yypt-2].token.Pos.Line) 1002 } 1003 case 72: 1004 //line parser.go.y:404 1005 { 1006 yyS[yypt-1].expr.(*ast.FuncCallExpr).AdjustRet = true 1007 yyVAL.expr = yyS[yypt-1].expr 1008 } 1009 case 73: 1010 //line parser.go.y:410 1011 { 1012 yyVAL.expr = &ast.FuncCallExpr{Func: yyS[yypt-1].expr, Args: yyS[yypt-0].exprlist} 1013 yyVAL.expr.SetLine(yyS[yypt-1].expr.Line()) 1014 } 1015 case 74: 1016 //line parser.go.y:414 1017 { 1018 yyVAL.expr = &ast.FuncCallExpr{Method: yyS[yypt-1].token.Str, Receiver: yyS[yypt-3].expr, Args: yyS[yypt-0].exprlist} 1019 yyVAL.expr.SetLine(yyS[yypt-3].expr.Line()) 1020 } 1021 case 75: 1022 //line parser.go.y:420 1023 { 1024 if yylex.(*Lexer).PNewLine { 1025 yylex.(*Lexer).TokenError(yyS[yypt-1].token, "ambiguous syntax (function call x new statement)") 1026 } 1027 yyVAL.exprlist = []ast.Expr{} 1028 } 1029 case 76: 1030 //line parser.go.y:426 1031 { 1032 if yylex.(*Lexer).PNewLine { 1033 yylex.(*Lexer).TokenError(yyS[yypt-2].token, "ambiguous syntax (function call x new statement)") 1034 } 1035 yyVAL.exprlist = yyS[yypt-1].exprlist 1036 } 1037 case 77: 1038 //line parser.go.y:432 1039 { 1040 yyVAL.exprlist = []ast.Expr{yyS[yypt-0].expr} 1041 } 1042 case 78: 1043 //line parser.go.y:435 1044 { 1045 yyVAL.exprlist = []ast.Expr{yyS[yypt-0].expr} 1046 } 1047 case 79: 1048 //line parser.go.y:440 1049 { 1050 yyVAL.expr = &ast.FunctionExpr{ParList: yyS[yypt-0].funcexpr.ParList, Stmts: yyS[yypt-0].funcexpr.Stmts} 1051 yyVAL.expr.SetLine(yyS[yypt-1].token.Pos.Line) 1052 yyVAL.expr.SetLastLine(yyS[yypt-0].funcexpr.LastLine()) 1053 } 1054 case 80: 1055 //line parser.go.y:447 1056 { 1057 yyVAL.funcexpr = &ast.FunctionExpr{ParList: yyS[yypt-3].parlist, Stmts: yyS[yypt-1].stmts} 1058 yyVAL.funcexpr.SetLine(yyS[yypt-4].token.Pos.Line) 1059 yyVAL.funcexpr.SetLastLine(yyS[yypt-0].token.Pos.Line) 1060 } 1061 case 81: 1062 //line parser.go.y:452 1063 { 1064 yyVAL.funcexpr = &ast.FunctionExpr{ParList: &ast.ParList{HasVargs: false, Names: []string{}}, Stmts: yyS[yypt-1].stmts} 1065 yyVAL.funcexpr.SetLine(yyS[yypt-3].token.Pos.Line) 1066 yyVAL.funcexpr.SetLastLine(yyS[yypt-0].token.Pos.Line) 1067 } 1068 case 82: 1069 //line parser.go.y:459 1070 { 1071 yyVAL.parlist = &ast.ParList{HasVargs: true, Names: []string{}} 1072 } 1073 case 83: 1074 //line parser.go.y:462 1075 { 1076 yyVAL.parlist = &ast.ParList{HasVargs: false, Names: []string{}} 1077 yyVAL.parlist.Names = append(yyVAL.parlist.Names, yyS[yypt-0].namelist...) 1078 } 1079 case 84: 1080 //line parser.go.y:466 1081 { 1082 yyVAL.parlist = &ast.ParList{HasVargs: true, Names: []string{}} 1083 yyVAL.parlist.Names = append(yyVAL.parlist.Names, yyS[yypt-2].namelist...) 1084 } 1085 case 85: 1086 //line parser.go.y:473 1087 { 1088 yyVAL.expr = &ast.TableExpr{Fields: []*ast.Field{}} 1089 yyVAL.expr.SetLine(yyS[yypt-1].token.Pos.Line) 1090 } 1091 case 86: 1092 //line parser.go.y:477 1093 { 1094 yyVAL.expr = &ast.TableExpr{Fields: yyS[yypt-1].fieldlist} 1095 yyVAL.expr.SetLine(yyS[yypt-2].token.Pos.Line) 1096 } 1097 case 87: 1098 //line parser.go.y:484 1099 { 1100 yyVAL.fieldlist = []*ast.Field{yyS[yypt-0].field} 1101 } 1102 case 88: 1103 //line parser.go.y:487 1104 { 1105 yyVAL.fieldlist = append(yyS[yypt-2].fieldlist, yyS[yypt-0].field) 1106 } 1107 case 89: 1108 //line parser.go.y:490 1109 { 1110 yyVAL.fieldlist = yyS[yypt-1].fieldlist 1111 } 1112 case 90: 1113 //line parser.go.y:495 1114 { 1115 yyVAL.field = &ast.Field{Key: &ast.StringExpr{Value: yyS[yypt-2].token.Str}, Value: yyS[yypt-0].expr} 1116 yyVAL.field.Key.SetLine(yyS[yypt-2].token.Pos.Line) 1117 } 1118 case 91: 1119 //line parser.go.y:499 1120 { 1121 yyVAL.field = &ast.Field{Key: yyS[yypt-3].expr, Value: yyS[yypt-0].expr} 1122 } 1123 case 92: 1124 //line parser.go.y:502 1125 { 1126 yyVAL.field = &ast.Field{Value: yyS[yypt-0].expr} 1127 } 1128 case 93: 1129 //line parser.go.y:507 1130 { 1131 yyVAL.fieldsep = "," 1132 } 1133 case 94: 1134 //line parser.go.y:510 1135 { 1136 yyVAL.fieldsep = ";" 1137 } 1138 } 1139 goto yystack /* stack new state and value */ 1140 }