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