github.com/mithrandie/csvq@v1.18.1/lib/json/query_parser.go (about) 1 // Code generated by goyacc -p jq -o lib/json/query_parser.go -v lib/json/query_parser.output lib/json/query_parser.y. DO NOT EDIT. 2 3 //line lib/json/query_parser.y:2 4 package json 5 6 import __yyfmt__ "fmt" 7 8 //line lib/json/query_parser.y:2 9 10 import "strconv" 11 12 //line lib/json/query_parser.y:7 13 type jqSymType struct { 14 yys int 15 expression QueryExpression 16 element Element 17 field FieldExpr 18 fields []FieldExpr 19 token QueryToken 20 } 21 22 const PATH_IDENTIFIER = 57346 23 const PATH_INDEX = 57347 24 const AS = 57348 25 26 var jqToknames = [...]string{ 27 "$end", 28 "error", 29 "$unk", 30 "PATH_IDENTIFIER", 31 "PATH_INDEX", 32 "AS", 33 "'.'", 34 "'['", 35 "']'", 36 "'{'", 37 "'}'", 38 "','", 39 } 40 41 var jqStatenames = [...]string{} 42 43 const jqEofCode = 1 44 const jqErrCode = 2 45 const jqInitialStackSize = 16 46 47 //line lib/json/query_parser.y:185 48 49 func ParseQuery(src string) (QueryExpression, error) { 50 l := new(QueryLexer) 51 l.Init(src) 52 jqParse(l) 53 return l.query, l.err 54 } 55 56 //line yacctab:1 57 var jqExca = [...]int{ 58 -1, 1, 59 1, -1, 60 -2, 0, 61 } 62 63 const jqPrivate = 57344 64 65 const jqLast = 50 66 67 var jqAct = [...]int{ 68 18, 3, 23, 16, 26, 6, 5, 30, 8, 4, 69 9, 40, 20, 13, 12, 10, 8, 11, 9, 27, 70 7, 25, 29, 34, 8, 35, 9, 33, 32, 38, 71 36, 31, 39, 14, 41, 24, 19, 15, 28, 24, 72 22, 24, 43, 42, 21, 7, 37, 17, 2, 1, 73 } 74 75 var jqPact = [...]int{ 76 16, -1000, -1000, -1000, -1000, -1000, -1000, 8, 28, 32, 77 41, -1000, -1000, -1000, 35, 33, 10, -8, 13, 31, 78 -1000, 0, 32, -1000, 20, -1000, 32, 42, 32, -1000, 79 41, -1000, -1000, -1000, -1000, 2, -1000, -1000, -1000, -1000, 80 27, 32, -1000, -1000, 81 } 82 83 var jqPgo = [...]int{ 84 0, 49, 48, 1, 0, 9, 2, 6, 5, 47, 85 3, 86 } 87 88 var jqR1 = [...]int{ 89 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 90 3, 3, 4, 4, 4, 5, 5, 5, 5, 5, 91 6, 6, 6, 7, 7, 7, 8, 9, 9, 10, 92 10, 10, 93 } 94 95 var jqR2 = [...]int{ 96 0, 0, 1, 1, 1, 1, 1, 1, 3, 2, 97 2, 2, 1, 3, 2, 3, 5, 4, 4, 4, 98 3, 5, 4, 2, 4, 3, 3, 1, 3, 0, 99 1, 3, 100 } 101 102 var jqChk = [...]int{ 103 -1000, -1, -2, -3, -5, -7, -8, 4, 8, 10, 104 7, -5, -7, -8, 5, 9, -10, -9, -4, 4, 105 -3, 9, 7, -6, 8, 11, 12, 6, 7, -6, 106 7, -5, -7, -8, -4, 5, -10, 4, -4, -3, 107 9, 7, -6, -4, 108 } 109 110 var jqDef = [...]int{ 111 1, -2, 2, 3, 4, 5, 6, 7, 0, 29, 112 0, 9, 10, 11, 0, 23, 0, 30, 27, 12, 113 8, 15, 0, 25, 0, 26, 29, 0, 0, 14, 114 0, 17, 18, 19, 24, 0, 31, 28, 13, 16, 115 20, 0, 22, 21, 116 } 117 118 var jqTok1 = [...]int{ 119 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 120 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 121 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 122 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 123 3, 3, 3, 3, 12, 3, 7, 3, 3, 3, 124 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 125 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 126 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 127 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 128 3, 8, 3, 9, 3, 3, 3, 3, 3, 3, 129 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 130 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 131 3, 3, 3, 10, 3, 11, 132 } 133 134 var jqTok2 = [...]int{ 135 2, 3, 4, 5, 6, 136 } 137 138 var jqTok3 = [...]int{ 139 0, 140 } 141 142 var jqErrorMessages = [...]struct { 143 state int 144 token int 145 msg string 146 }{} 147 148 //line yaccpar:1 149 150 /* parser for yacc output */ 151 152 var ( 153 jqDebug = 0 154 jqErrorVerbose = false 155 ) 156 157 type jqLexer interface { 158 Lex(lval *jqSymType) int 159 Error(s string) 160 } 161 162 type jqParser interface { 163 Parse(jqLexer) int 164 Lookahead() int 165 } 166 167 type jqParserImpl struct { 168 lval jqSymType 169 stack [jqInitialStackSize]jqSymType 170 char int 171 } 172 173 func (p *jqParserImpl) Lookahead() int { 174 return p.char 175 } 176 177 func jqNewParser() jqParser { 178 return &jqParserImpl{} 179 } 180 181 const jqFlag = -1000 182 183 func jqTokname(c int) string { 184 if c >= 1 && c-1 < len(jqToknames) { 185 if jqToknames[c-1] != "" { 186 return jqToknames[c-1] 187 } 188 } 189 return __yyfmt__.Sprintf("tok-%v", c) 190 } 191 192 func jqStatname(s int) string { 193 if s >= 0 && s < len(jqStatenames) { 194 if jqStatenames[s] != "" { 195 return jqStatenames[s] 196 } 197 } 198 return __yyfmt__.Sprintf("state-%v", s) 199 } 200 201 func jqErrorMessage(state, lookAhead int) string { 202 const TOKSTART = 4 203 204 if !jqErrorVerbose { 205 return "syntax error" 206 } 207 208 for _, e := range jqErrorMessages { 209 if e.state == state && e.token == lookAhead { 210 return "syntax error: " + e.msg 211 } 212 } 213 214 res := "syntax error: unexpected " + jqTokname(lookAhead) 215 216 // To match Bison, suggest at most four expected tokens. 217 expected := make([]int, 0, 4) 218 219 // Look for shiftable tokens. 220 base := jqPact[state] 221 for tok := TOKSTART; tok-1 < len(jqToknames); tok++ { 222 if n := base + tok; n >= 0 && n < jqLast && jqChk[jqAct[n]] == tok { 223 if len(expected) == cap(expected) { 224 return res 225 } 226 expected = append(expected, tok) 227 } 228 } 229 230 if jqDef[state] == -2 { 231 i := 0 232 for jqExca[i] != -1 || jqExca[i+1] != state { 233 i += 2 234 } 235 236 // Look for tokens that we accept or reduce. 237 for i += 2; jqExca[i] >= 0; i += 2 { 238 tok := jqExca[i] 239 if tok < TOKSTART || jqExca[i+1] == 0 { 240 continue 241 } 242 if len(expected) == cap(expected) { 243 return res 244 } 245 expected = append(expected, tok) 246 } 247 248 // If the default action is to accept or reduce, give up. 249 if jqExca[i+1] != 0 { 250 return res 251 } 252 } 253 254 for i, tok := range expected { 255 if i == 0 { 256 res += ", expecting " 257 } else { 258 res += " or " 259 } 260 res += jqTokname(tok) 261 } 262 return res 263 } 264 265 func jqlex1(lex jqLexer, lval *jqSymType) (char, token int) { 266 token = 0 267 char = lex.Lex(lval) 268 if char <= 0 { 269 token = jqTok1[0] 270 goto out 271 } 272 if char < len(jqTok1) { 273 token = jqTok1[char] 274 goto out 275 } 276 if char >= jqPrivate { 277 if char < jqPrivate+len(jqTok2) { 278 token = jqTok2[char-jqPrivate] 279 goto out 280 } 281 } 282 for i := 0; i < len(jqTok3); i += 2 { 283 token = jqTok3[i+0] 284 if token == char { 285 token = jqTok3[i+1] 286 goto out 287 } 288 } 289 290 out: 291 if token == 0 { 292 token = jqTok2[1] /* unknown char */ 293 } 294 if jqDebug >= 3 { 295 __yyfmt__.Printf("lex %s(%d)\n", jqTokname(token), uint(char)) 296 } 297 return char, token 298 } 299 300 func jqParse(jqlex jqLexer) int { 301 return jqNewParser().Parse(jqlex) 302 } 303 304 func (jqrcvr *jqParserImpl) Parse(jqlex jqLexer) int { 305 var jqn int 306 var jqVAL jqSymType 307 var jqDollar []jqSymType 308 _ = jqDollar // silence set and not used 309 jqS := jqrcvr.stack[:] 310 311 Nerrs := 0 /* number of errors */ 312 Errflag := 0 /* error recovery flag */ 313 jqstate := 0 314 jqrcvr.char = -1 315 jqtoken := -1 // jqrcvr.char translated into internal numbering 316 defer func() { 317 // Make sure we report no lookahead when not parsing. 318 jqstate = -1 319 jqrcvr.char = -1 320 jqtoken = -1 321 }() 322 jqp := -1 323 goto jqstack 324 325 ret0: 326 return 0 327 328 ret1: 329 return 1 330 331 jqstack: 332 /* put a state and value onto the stack */ 333 if jqDebug >= 4 { 334 __yyfmt__.Printf("char %v in %v\n", jqTokname(jqtoken), jqStatname(jqstate)) 335 } 336 337 jqp++ 338 if jqp >= len(jqS) { 339 nyys := make([]jqSymType, len(jqS)*2) 340 copy(nyys, jqS) 341 jqS = nyys 342 } 343 jqS[jqp] = jqVAL 344 jqS[jqp].yys = jqstate 345 346 jqnewstate: 347 jqn = jqPact[jqstate] 348 if jqn <= jqFlag { 349 goto jqdefault /* simple state */ 350 } 351 if jqrcvr.char < 0 { 352 jqrcvr.char, jqtoken = jqlex1(jqlex, &jqrcvr.lval) 353 } 354 jqn += jqtoken 355 if jqn < 0 || jqn >= jqLast { 356 goto jqdefault 357 } 358 jqn = jqAct[jqn] 359 if jqChk[jqn] == jqtoken { /* valid shift */ 360 jqrcvr.char = -1 361 jqtoken = -1 362 jqVAL = jqrcvr.lval 363 jqstate = jqn 364 if Errflag > 0 { 365 Errflag-- 366 } 367 goto jqstack 368 } 369 370 jqdefault: 371 /* default state action */ 372 jqn = jqDef[jqstate] 373 if jqn == -2 { 374 if jqrcvr.char < 0 { 375 jqrcvr.char, jqtoken = jqlex1(jqlex, &jqrcvr.lval) 376 } 377 378 /* look through exception table */ 379 xi := 0 380 for { 381 if jqExca[xi+0] == -1 && jqExca[xi+1] == jqstate { 382 break 383 } 384 xi += 2 385 } 386 for xi += 2; ; xi += 2 { 387 jqn = jqExca[xi+0] 388 if jqn < 0 || jqn == jqtoken { 389 break 390 } 391 } 392 jqn = jqExca[xi+1] 393 if jqn < 0 { 394 goto ret0 395 } 396 } 397 if jqn == 0 { 398 /* error ... attempt to resume parsing */ 399 switch Errflag { 400 case 0: /* brand new error */ 401 jqlex.Error(jqErrorMessage(jqstate, jqtoken)) 402 Nerrs++ 403 if jqDebug >= 1 { 404 __yyfmt__.Printf("%s", jqStatname(jqstate)) 405 __yyfmt__.Printf(" saw %s\n", jqTokname(jqtoken)) 406 } 407 fallthrough 408 409 case 1, 2: /* incompletely recovered error ... try again */ 410 Errflag = 3 411 412 /* find a state where "error" is a legal shift action */ 413 for jqp >= 0 { 414 jqn = jqPact[jqS[jqp].yys] + jqErrCode 415 if jqn >= 0 && jqn < jqLast { 416 jqstate = jqAct[jqn] /* simulate a shift of "error" */ 417 if jqChk[jqstate] == jqErrCode { 418 goto jqstack 419 } 420 } 421 422 /* the current p has no shift on "error", pop stack */ 423 if jqDebug >= 2 { 424 __yyfmt__.Printf("error recovery pops state %d\n", jqS[jqp].yys) 425 } 426 jqp-- 427 } 428 /* there is no state on the stack with an error shift ... abort */ 429 goto ret1 430 431 case 3: /* no shift yet; clobber input char */ 432 if jqDebug >= 2 { 433 __yyfmt__.Printf("error recovery discards %s\n", jqTokname(jqtoken)) 434 } 435 if jqtoken == jqEofCode { 436 goto ret1 437 } 438 jqrcvr.char = -1 439 jqtoken = -1 440 goto jqnewstate /* try again in the same state */ 441 } 442 } 443 444 /* reduction by production jqn */ 445 if jqDebug >= 2 { 446 __yyfmt__.Printf("reduce %v in:\n\t%v\n", jqn, jqStatname(jqstate)) 447 } 448 449 jqnt := jqn 450 jqpt := jqp 451 _ = jqpt // guard against "declared and not used" 452 453 jqp -= jqR2[jqn] 454 // jqp is now the index of $0. Perform the default action. Iff the 455 // reduced production is ε, $1 is possibly out of range. 456 if jqp+1 >= len(jqS) { 457 nyys := make([]jqSymType, len(jqS)*2) 458 copy(nyys, jqS) 459 jqS = nyys 460 } 461 jqVAL = jqS[jqp+1] 462 463 /* consult goto table to find next state */ 464 jqn = jqR1[jqn] 465 jqg := jqPgo[jqn] 466 jqj := jqg + jqS[jqp].yys + 1 467 468 if jqj >= jqLast { 469 jqstate = jqAct[jqg] 470 } else { 471 jqstate = jqAct[jqj] 472 if jqChk[jqstate] != -jqn { 473 jqstate = jqAct[jqg] 474 } 475 } 476 // dummy call; replaced with literal code 477 switch jqnt { 478 479 case 1: 480 jqDollar = jqS[jqpt-0 : jqpt+1] 481 //line lib/json/query_parser.y:33 482 { 483 jqVAL.expression = nil 484 jqlex.(*QueryLexer).query = jqVAL.expression 485 } 486 case 2: 487 jqDollar = jqS[jqpt-1 : jqpt+1] 488 //line lib/json/query_parser.y:38 489 { 490 jqVAL.expression = jqDollar[1].expression 491 jqlex.(*QueryLexer).query = jqVAL.expression 492 } 493 case 3: 494 jqDollar = jqS[jqpt-1 : jqpt+1] 495 //line lib/json/query_parser.y:45 496 { 497 jqVAL.expression = jqDollar[1].element 498 } 499 case 4: 500 jqDollar = jqS[jqpt-1 : jqpt+1] 501 //line lib/json/query_parser.y:49 502 { 503 jqVAL.expression = jqDollar[1].expression 504 } 505 case 5: 506 jqDollar = jqS[jqpt-1 : jqpt+1] 507 //line lib/json/query_parser.y:53 508 { 509 jqVAL.expression = jqDollar[1].expression 510 } 511 case 6: 512 jqDollar = jqS[jqpt-1 : jqpt+1] 513 //line lib/json/query_parser.y:57 514 { 515 jqVAL.expression = jqDollar[1].expression 516 } 517 case 7: 518 jqDollar = jqS[jqpt-1 : jqpt+1] 519 //line lib/json/query_parser.y:63 520 { 521 jqVAL.element = Element{Label: jqDollar[1].token.Literal} 522 } 523 case 8: 524 jqDollar = jqS[jqpt-3 : jqpt+1] 525 //line lib/json/query_parser.y:67 526 { 527 jqVAL.element = Element{Label: jqDollar[1].token.Literal, Child: jqDollar[3].element} 528 } 529 case 9: 530 jqDollar = jqS[jqpt-2 : jqpt+1] 531 //line lib/json/query_parser.y:71 532 { 533 jqVAL.element = Element{Label: jqDollar[1].token.Literal, Child: jqDollar[2].expression} 534 } 535 case 10: 536 jqDollar = jqS[jqpt-2 : jqpt+1] 537 //line lib/json/query_parser.y:75 538 { 539 jqVAL.element = Element{Label: jqDollar[1].token.Literal, Child: jqDollar[2].expression} 540 } 541 case 11: 542 jqDollar = jqS[jqpt-2 : jqpt+1] 543 //line lib/json/query_parser.y:79 544 { 545 jqVAL.element = Element{Label: jqDollar[1].token.Literal, Child: jqDollar[2].expression} 546 } 547 case 12: 548 jqDollar = jqS[jqpt-1 : jqpt+1] 549 //line lib/json/query_parser.y:85 550 { 551 jqVAL.element = Element{Label: jqDollar[1].token.Literal} 552 } 553 case 13: 554 jqDollar = jqS[jqpt-3 : jqpt+1] 555 //line lib/json/query_parser.y:89 556 { 557 jqVAL.element = Element{Label: jqDollar[1].token.Literal, Child: jqDollar[3].element} 558 } 559 case 14: 560 jqDollar = jqS[jqpt-2 : jqpt+1] 561 //line lib/json/query_parser.y:93 562 { 563 jqVAL.element = Element{Label: jqDollar[1].token.Literal, Child: jqDollar[2].expression} 564 } 565 case 15: 566 jqDollar = jqS[jqpt-3 : jqpt+1] 567 //line lib/json/query_parser.y:99 568 { 569 i, _ := strconv.Atoi(jqDollar[2].token.Literal) 570 jqVAL.expression = ArrayItem{Index: i} 571 } 572 case 16: 573 jqDollar = jqS[jqpt-5 : jqpt+1] 574 //line lib/json/query_parser.y:104 575 { 576 i, _ := strconv.Atoi(jqDollar[2].token.Literal) 577 jqVAL.expression = ArrayItem{Index: i, Child: jqDollar[5].element} 578 } 579 case 17: 580 jqDollar = jqS[jqpt-4 : jqpt+1] 581 //line lib/json/query_parser.y:109 582 { 583 i, _ := strconv.Atoi(jqDollar[2].token.Literal) 584 jqVAL.expression = ArrayItem{Index: i, Child: jqDollar[4].expression} 585 } 586 case 18: 587 jqDollar = jqS[jqpt-4 : jqpt+1] 588 //line lib/json/query_parser.y:114 589 { 590 i, _ := strconv.Atoi(jqDollar[2].token.Literal) 591 jqVAL.expression = ArrayItem{Index: i, Child: jqDollar[4].expression} 592 } 593 case 19: 594 jqDollar = jqS[jqpt-4 : jqpt+1] 595 //line lib/json/query_parser.y:119 596 { 597 i, _ := strconv.Atoi(jqDollar[2].token.Literal) 598 jqVAL.expression = ArrayItem{Index: i, Child: jqDollar[4].expression} 599 } 600 case 20: 601 jqDollar = jqS[jqpt-3 : jqpt+1] 602 //line lib/json/query_parser.y:126 603 { 604 i, _ := strconv.Atoi(jqDollar[2].token.Literal) 605 jqVAL.expression = ArrayItem{Index: i} 606 } 607 case 21: 608 jqDollar = jqS[jqpt-5 : jqpt+1] 609 //line lib/json/query_parser.y:131 610 { 611 i, _ := strconv.Atoi(jqDollar[2].token.Literal) 612 jqVAL.expression = ArrayItem{Index: i, Child: jqDollar[5].element} 613 } 614 case 22: 615 jqDollar = jqS[jqpt-4 : jqpt+1] 616 //line lib/json/query_parser.y:136 617 { 618 i, _ := strconv.Atoi(jqDollar[2].token.Literal) 619 jqVAL.expression = ArrayItem{Index: i, Child: jqDollar[4].expression} 620 } 621 case 23: 622 jqDollar = jqS[jqpt-2 : jqpt+1] 623 //line lib/json/query_parser.y:143 624 { 625 jqVAL.expression = RowValueExpr{} 626 } 627 case 24: 628 jqDollar = jqS[jqpt-4 : jqpt+1] 629 //line lib/json/query_parser.y:147 630 { 631 jqVAL.expression = RowValueExpr{Child: jqDollar[4].element} 632 } 633 case 25: 634 jqDollar = jqS[jqpt-3 : jqpt+1] 635 //line lib/json/query_parser.y:151 636 { 637 jqVAL.expression = RowValueExpr{Child: jqDollar[3].expression} 638 } 639 case 26: 640 jqDollar = jqS[jqpt-3 : jqpt+1] 641 //line lib/json/query_parser.y:157 642 { 643 jqVAL.expression = TableExpr{Fields: jqDollar[2].fields} 644 } 645 case 27: 646 jqDollar = jqS[jqpt-1 : jqpt+1] 647 //line lib/json/query_parser.y:163 648 { 649 jqVAL.field = FieldExpr{Element: jqDollar[1].element} 650 } 651 case 28: 652 jqDollar = jqS[jqpt-3 : jqpt+1] 653 //line lib/json/query_parser.y:167 654 { 655 jqVAL.field = FieldExpr{Element: jqDollar[1].element, Alias: jqDollar[3].token.Literal} 656 } 657 case 29: 658 jqDollar = jqS[jqpt-0 : jqpt+1] 659 //line lib/json/query_parser.y:173 660 { 661 jqVAL.fields = nil 662 } 663 case 30: 664 jqDollar = jqS[jqpt-1 : jqpt+1] 665 //line lib/json/query_parser.y:177 666 { 667 jqVAL.fields = []FieldExpr{jqDollar[1].field} 668 } 669 case 31: 670 jqDollar = jqS[jqpt-3 : jqpt+1] 671 //line lib/json/query_parser.y:181 672 { 673 jqVAL.fields = append([]FieldExpr{jqDollar[1].field}, jqDollar[3].fields...) 674 } 675 } 676 goto jqstack /* stack new state and value */ 677 }