github.com/hattya/go.sh@v0.0.0-20240328132134-f53276d95cc6/interp/arith.go (about) 1 // Code generated by goyacc -l -o arith.go arith.go.y. DO NOT EDIT. 2 // 3 // go.sh/interp :: arith.go 4 // 5 // Copyright (c) 2021 Akinori Hattori <hattya@gmail.com> 6 // 7 // SPDX-License-Identifier: MIT 8 // 9 10 package interp 11 12 import __yyfmt__ "fmt" 13 14 import ( 15 "fmt" 16 "strconv" 17 "strings" 18 ) 19 20 type yySymType struct { 21 yys int 22 op string 23 expr expr 24 } 25 26 const NUMBER = 57346 27 const IDENT = 57347 28 const INC = 57348 29 const DEC = 57349 30 const LSH = 57350 31 const RSH = 57351 32 const LE = 57352 33 const GE = 57353 34 const EQ = 57354 35 const NE = 57355 36 const LAND = 57356 37 const LOR = 57357 38 const MUL_ASSIGN = 57358 39 const DIV_ASSIGN = 57359 40 const MOD_ASSIGN = 57360 41 const ADD_ASSIGN = 57361 42 const SUB_ASSIGN = 57362 43 const LSH_ASSIGN = 57363 44 const RSH_ASSIGN = 57364 45 const AND_ASSIGN = 57365 46 const XOR_ASSIGN = 57366 47 const OR_ASSIGN = 57367 48 49 var yyToknames = [...]string{ 50 "$end", 51 "error", 52 "$unk", 53 "NUMBER", 54 "IDENT", 55 "'('", 56 "')'", 57 "INC", 58 "DEC", 59 "'+'", 60 "'-'", 61 "'~'", 62 "'!'", 63 "'*'", 64 "'/'", 65 "'%'", 66 "LSH", 67 "RSH", 68 "'<'", 69 "'>'", 70 "LE", 71 "GE", 72 "EQ", 73 "NE", 74 "'&'", 75 "'^'", 76 "'|'", 77 "LAND", 78 "LOR", 79 "'?'", 80 "':'", 81 "'='", 82 "MUL_ASSIGN", 83 "DIV_ASSIGN", 84 "MOD_ASSIGN", 85 "ADD_ASSIGN", 86 "SUB_ASSIGN", 87 "LSH_ASSIGN", 88 "RSH_ASSIGN", 89 "AND_ASSIGN", 90 "XOR_ASSIGN", 91 "OR_ASSIGN", 92 } 93 94 var yyStatenames = [...]string{} 95 96 const yyEofCode = 1 97 const yyErrCode = 2 98 const yyInitialStackSize = 16 99 100 func init() { 101 yyErrorVerbose = true 102 103 for i, s := range yyToknames { 104 switch s { 105 case "$end": 106 s = "EOF" 107 case "INC": 108 s = "'++'" 109 case "DEC": 110 s = "'--'" 111 case "LSH": 112 s = "'<<'" 113 case "RSH": 114 s = "'>>'" 115 case "LE": 116 s = "'<='" 117 case "GE": 118 s = "'>='" 119 case "EQ": 120 s = "'=='" 121 case "NE": 122 s = "'!='" 123 case "LAND": 124 s = "'&&'" 125 case "LOR": 126 s = "'||'" 127 case "MUL_ASSIGN": 128 s = "'*='" 129 case "DIV_ASSIGN": 130 s = "'/='" 131 case "MOD_ASSIGN": 132 s = "'%='" 133 case "ADD_ASSIGN": 134 s = "'+='" 135 case "SUB_ASSIGN": 136 s = "'-='" 137 case "LSH_ASSIGN": 138 s = "'<<='" 139 case "RSH_ASSIGN": 140 s = "'>>='" 141 case "AND_ASSIGN": 142 s = "'&='" 143 case "XOR_ASSIGN": 144 s = "'^='" 145 case "OR_ASSIGN": 146 s = "'|='" 147 } 148 yyToknames[i] = s 149 } 150 } 151 152 type expr struct { 153 n int 154 s string 155 } 156 157 func errLValue(op string) string { 158 return fmt.Sprintf("'%v' requires lvalue", op) 159 } 160 161 func expand(yylex yyLexer, x expr) (int, bool) { 162 if x.s == "" { 163 return x.n, true 164 } else if v, set := yylex.(*lexer).env.Get(x.s); !set || v.Value == "" { 165 return 0, true 166 } else if n, err := strconv.ParseInt(v.Value, 0, 0); err != nil { 167 yylex.Error(fmt.Sprintf("invalid number %q", v.Value)) 168 return 0, false 169 } else { 170 return int(n), true 171 } 172 } 173 174 func calculate(yylex yyLexer, l expr, op string, r expr) (x expr, ok bool) { 175 if l, ok1 := expand(yylex, l); ok1 { 176 if r, ok2 := expand(yylex, r); ok2 { 177 ok = true 178 switch op { 179 case "*": 180 x.n = l * r 181 case "/": 182 x.n = l / r 183 case "%": 184 x.n = l % r 185 case "+": 186 x.n = l + r 187 case "-": 188 x.n = l - r 189 case "<<": 190 x.n = l << r 191 case ">>": 192 x.n = l >> r 193 case "&": 194 x.n = l & r 195 case "^": 196 x.n = l ^ r 197 case "|": 198 x.n = l | r 199 } 200 } 201 } 202 return 203 } 204 205 func compare(yylex yyLexer, l expr, op string, r expr) (x expr) { 206 if l, ok := expand(yylex, l); ok { 207 if r, ok := expand(yylex, r); ok { 208 var b bool 209 switch op { 210 case "<": 211 b = l < r 212 case ">": 213 b = l > r 214 case "<=": 215 b = l <= r 216 case ">=": 217 b = l >= r 218 case "==": 219 b = l == r 220 case "!=": 221 b = l != r 222 } 223 if b { 224 x.n = 1 225 } 226 } 227 } 228 return 229 } 230 231 // Eval evaluates an arithmetic expression. 232 func (env *ExecEnv) Eval(expr string) (n int, err error) { 233 l := newLexer(env, strings.NewReader(expr)) 234 defer func() { 235 if e := recover(); e != nil { 236 l.Error(e.(error).Error()) 237 err = l.err 238 } 239 }() 240 241 yyParse(l) 242 return l.n, l.err 243 } 244 245 var yyExca = [...]int{ 246 -1, 1, 247 1, -1, 248 -2, 0, 249 } 250 251 const yyPrivate = 57344 252 253 const yyLast = 98 254 255 var yyAct = [...]int{ 256 3, 66, 4, 24, 22, 20, 26, 16, 10, 43, 257 44, 45, 25, 86, 39, 40, 23, 46, 47, 49, 258 50, 4, 21, 53, 54, 55, 56, 57, 58, 4, 259 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 260 38, 70, 4, 51, 52, 61, 62, 63, 65, 59, 261 60, 41, 42, 69, 68, 72, 2, 75, 76, 77, 262 78, 1, 27, 83, 84, 85, 81, 82, 73, 74, 263 79, 80, 71, 17, 18, 19, 48, 7, 8, 12, 264 13, 14, 15, 5, 64, 9, 6, 87, 11, 0, 265 0, 0, 0, 0, 0, 0, 0, 67, 266 } 267 268 var yyPact = [...]int{ 269 69, -1000, -1000, -1000, -2, -15, 43, 69, 69, 69, 270 -11, -1000, -1000, -1000, -1000, -1000, -9, -1000, -1000, 69, 271 -7, -5, 20, 4, 10, 39, 31, 69, -1000, -1000, 272 -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 69, 273 69, -1000, -1000, -1000, -1000, -1000, 69, 69, 34, 69, 274 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 275 69, 69, 69, 69, -1000, -11, -1000, -18, -9, -7, 276 -1000, -5, 20, 4, 4, 10, 10, 10, 10, 39, 277 39, 31, 31, -1000, -1000, -1000, 69, -1000, 278 } 279 280 var yyPgo = [...]int{ 281 0, 88, 86, 1, 85, 6, 12, 3, 16, 4, 282 22, 5, 7, 8, 83, 0, 56, 62, 61, 283 } 284 285 var yyR1 = [...]int{ 286 0, 18, 1, 1, 1, 2, 2, 2, 3, 3, 287 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 288 6, 6, 6, 7, 7, 7, 8, 8, 8, 8, 289 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 290 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 291 17, 17, 17, 17, 17, 17, 17, 17, 17, 292 } 293 294 var yyR2 = [...]int{ 295 0, 1, 1, 1, 3, 1, 2, 2, 1, 2, 296 2, 2, 1, 1, 1, 1, 1, 3, 3, 3, 297 1, 3, 3, 1, 3, 3, 1, 3, 3, 3, 298 3, 1, 3, 3, 1, 3, 1, 3, 1, 3, 299 1, 3, 1, 3, 1, 5, 1, 3, 1, 1, 300 1, 1, 1, 1, 1, 1, 1, 1, 1, 301 } 302 303 var yyChk = [...]int{ 304 -1000, -18, -16, -15, -3, -14, -2, 8, 9, -4, 305 -13, -1, 10, 11, 12, 13, -12, 4, 5, 6, 306 -11, -10, -9, -8, -7, -6, -5, -17, 32, 33, 307 34, 35, 36, 37, 38, 39, 40, 41, 42, 29, 308 30, 8, 9, -3, -3, -3, 28, 27, -16, 26, 309 25, 23, 24, 19, 20, 21, 22, 17, 18, 10, 310 11, 14, 15, 16, -16, -13, -3, -16, -12, -11, 311 7, -10, -9, -8, -8, -7, -7, -7, -7, -6, 312 -6, -5, -5, -3, -3, -3, 31, -15, 313 } 314 315 var yyDef = [...]int{ 316 0, -2, 1, 46, 16, 44, 8, 0, 0, 0, 317 42, 5, 12, 13, 14, 15, 40, 2, 3, 0, 318 38, 36, 34, 31, 26, 23, 20, 0, 48, 49, 319 50, 51, 52, 53, 54, 55, 56, 57, 58, 0, 320 0, 6, 7, 9, 10, 11, 0, 0, 0, 0, 321 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 322 0, 0, 0, 0, 47, 43, 16, 0, 41, 39, 323 4, 37, 35, 32, 33, 27, 28, 29, 30, 24, 324 25, 21, 22, 17, 18, 19, 0, 45, 325 } 326 327 var yyTok1 = [...]int{ 328 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 329 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 330 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 331 3, 3, 3, 13, 3, 3, 3, 16, 25, 3, 332 6, 7, 14, 10, 3, 11, 3, 15, 3, 3, 333 3, 3, 3, 3, 3, 3, 3, 3, 31, 3, 334 19, 32, 20, 30, 3, 3, 3, 3, 3, 3, 335 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 336 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 337 3, 3, 3, 3, 26, 3, 3, 3, 3, 3, 338 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 339 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 340 3, 3, 3, 3, 27, 3, 12, 341 } 342 343 var yyTok2 = [...]int{ 344 2, 3, 4, 5, 8, 9, 17, 18, 21, 22, 345 23, 24, 28, 29, 33, 34, 35, 36, 37, 38, 346 39, 40, 41, 42, 347 } 348 349 var yyTok3 = [...]int{ 350 0, 351 } 352 353 var yyErrorMessages = [...]struct { 354 state int 355 token int 356 msg string 357 }{} 358 359 /* parser for yacc output */ 360 361 var ( 362 yyDebug = 0 363 yyErrorVerbose = false 364 ) 365 366 type yyLexer interface { 367 Lex(lval *yySymType) int 368 Error(s string) 369 } 370 371 type yyParser interface { 372 Parse(yyLexer) int 373 Lookahead() int 374 } 375 376 type yyParserImpl struct { 377 lval yySymType 378 stack [yyInitialStackSize]yySymType 379 char int 380 } 381 382 func (p *yyParserImpl) Lookahead() int { 383 return p.char 384 } 385 386 func yyNewParser() yyParser { 387 return &yyParserImpl{} 388 } 389 390 const yyFlag = -1000 391 392 func yyTokname(c int) string { 393 if c >= 1 && c-1 < len(yyToknames) { 394 if yyToknames[c-1] != "" { 395 return yyToknames[c-1] 396 } 397 } 398 return __yyfmt__.Sprintf("tok-%v", c) 399 } 400 401 func yyStatname(s int) string { 402 if s >= 0 && s < len(yyStatenames) { 403 if yyStatenames[s] != "" { 404 return yyStatenames[s] 405 } 406 } 407 return __yyfmt__.Sprintf("state-%v", s) 408 } 409 410 func yyErrorMessage(state, lookAhead int) string { 411 const TOKSTART = 4 412 413 if !yyErrorVerbose { 414 return "syntax error" 415 } 416 417 for _, e := range yyErrorMessages { 418 if e.state == state && e.token == lookAhead { 419 return "syntax error: " + e.msg 420 } 421 } 422 423 res := "syntax error: unexpected " + yyTokname(lookAhead) 424 425 // To match Bison, suggest at most four expected tokens. 426 expected := make([]int, 0, 4) 427 428 // Look for shiftable tokens. 429 base := yyPact[state] 430 for tok := TOKSTART; tok-1 < len(yyToknames); tok++ { 431 if n := base + tok; n >= 0 && n < yyLast && yyChk[yyAct[n]] == tok { 432 if len(expected) == cap(expected) { 433 return res 434 } 435 expected = append(expected, tok) 436 } 437 } 438 439 if yyDef[state] == -2 { 440 i := 0 441 for yyExca[i] != -1 || yyExca[i+1] != state { 442 i += 2 443 } 444 445 // Look for tokens that we accept or reduce. 446 for i += 2; yyExca[i] >= 0; i += 2 { 447 tok := yyExca[i] 448 if tok < TOKSTART || yyExca[i+1] == 0 { 449 continue 450 } 451 if len(expected) == cap(expected) { 452 return res 453 } 454 expected = append(expected, tok) 455 } 456 457 // If the default action is to accept or reduce, give up. 458 if yyExca[i+1] != 0 { 459 return res 460 } 461 } 462 463 for i, tok := range expected { 464 if i == 0 { 465 res += ", expecting " 466 } else { 467 res += " or " 468 } 469 res += yyTokname(tok) 470 } 471 return res 472 } 473 474 func yylex1(lex yyLexer, lval *yySymType) (char, token int) { 475 token = 0 476 char = lex.Lex(lval) 477 if char <= 0 { 478 token = yyTok1[0] 479 goto out 480 } 481 if char < len(yyTok1) { 482 token = yyTok1[char] 483 goto out 484 } 485 if char >= yyPrivate { 486 if char < yyPrivate+len(yyTok2) { 487 token = yyTok2[char-yyPrivate] 488 goto out 489 } 490 } 491 for i := 0; i < len(yyTok3); i += 2 { 492 token = yyTok3[i+0] 493 if token == char { 494 token = yyTok3[i+1] 495 goto out 496 } 497 } 498 499 out: 500 if token == 0 { 501 token = yyTok2[1] /* unknown char */ 502 } 503 if yyDebug >= 3 { 504 __yyfmt__.Printf("lex %s(%d)\n", yyTokname(token), uint(char)) 505 } 506 return char, token 507 } 508 509 func yyParse(yylex yyLexer) int { 510 return yyNewParser().Parse(yylex) 511 } 512 513 func (yyrcvr *yyParserImpl) Parse(yylex yyLexer) int { 514 var yyn int 515 var yyVAL yySymType 516 var yyDollar []yySymType 517 _ = yyDollar // silence set and not used 518 yyS := yyrcvr.stack[:] 519 520 Nerrs := 0 /* number of errors */ 521 Errflag := 0 /* error recovery flag */ 522 yystate := 0 523 yyrcvr.char = -1 524 yytoken := -1 // yyrcvr.char translated into internal numbering 525 defer func() { 526 // Make sure we report no lookahead when not parsing. 527 yystate = -1 528 yyrcvr.char = -1 529 yytoken = -1 530 }() 531 yyp := -1 532 goto yystack 533 534 ret0: 535 return 0 536 537 ret1: 538 return 1 539 540 yystack: 541 /* put a state and value onto the stack */ 542 if yyDebug >= 4 { 543 __yyfmt__.Printf("char %v in %v\n", yyTokname(yytoken), yyStatname(yystate)) 544 } 545 546 yyp++ 547 if yyp >= len(yyS) { 548 nyys := make([]yySymType, len(yyS)*2) 549 copy(nyys, yyS) 550 yyS = nyys 551 } 552 yyS[yyp] = yyVAL 553 yyS[yyp].yys = yystate 554 555 yynewstate: 556 yyn = yyPact[yystate] 557 if yyn <= yyFlag { 558 goto yydefault /* simple state */ 559 } 560 if yyrcvr.char < 0 { 561 yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval) 562 } 563 yyn += yytoken 564 if yyn < 0 || yyn >= yyLast { 565 goto yydefault 566 } 567 yyn = yyAct[yyn] 568 if yyChk[yyn] == yytoken { /* valid shift */ 569 yyrcvr.char = -1 570 yytoken = -1 571 yyVAL = yyrcvr.lval 572 yystate = yyn 573 if Errflag > 0 { 574 Errflag-- 575 } 576 goto yystack 577 } 578 579 yydefault: 580 /* default state action */ 581 yyn = yyDef[yystate] 582 if yyn == -2 { 583 if yyrcvr.char < 0 { 584 yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval) 585 } 586 587 /* look through exception table */ 588 xi := 0 589 for { 590 if yyExca[xi+0] == -1 && yyExca[xi+1] == yystate { 591 break 592 } 593 xi += 2 594 } 595 for xi += 2; ; xi += 2 { 596 yyn = yyExca[xi+0] 597 if yyn < 0 || yyn == yytoken { 598 break 599 } 600 } 601 yyn = yyExca[xi+1] 602 if yyn < 0 { 603 goto ret0 604 } 605 } 606 if yyn == 0 { 607 /* error ... attempt to resume parsing */ 608 switch Errflag { 609 case 0: /* brand new error */ 610 yylex.Error(yyErrorMessage(yystate, yytoken)) 611 Nerrs++ 612 if yyDebug >= 1 { 613 __yyfmt__.Printf("%s", yyStatname(yystate)) 614 __yyfmt__.Printf(" saw %s\n", yyTokname(yytoken)) 615 } 616 fallthrough 617 618 case 1, 2: /* incompletely recovered error ... try again */ 619 Errflag = 3 620 621 /* find a state where "error" is a legal shift action */ 622 for yyp >= 0 { 623 yyn = yyPact[yyS[yyp].yys] + yyErrCode 624 if yyn >= 0 && yyn < yyLast { 625 yystate = yyAct[yyn] /* simulate a shift of "error" */ 626 if yyChk[yystate] == yyErrCode { 627 goto yystack 628 } 629 } 630 631 /* the current p has no shift on "error", pop stack */ 632 if yyDebug >= 2 { 633 __yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys) 634 } 635 yyp-- 636 } 637 /* there is no state on the stack with an error shift ... abort */ 638 goto ret1 639 640 case 3: /* no shift yet; clobber input char */ 641 if yyDebug >= 2 { 642 __yyfmt__.Printf("error recovery discards %s\n", yyTokname(yytoken)) 643 } 644 if yytoken == yyEofCode { 645 goto ret1 646 } 647 yyrcvr.char = -1 648 yytoken = -1 649 goto yynewstate /* try again in the same state */ 650 } 651 } 652 653 /* reduction by production yyn */ 654 if yyDebug >= 2 { 655 __yyfmt__.Printf("reduce %v in:\n\t%v\n", yyn, yyStatname(yystate)) 656 } 657 658 yynt := yyn 659 yypt := yyp 660 _ = yypt // guard against "declared and not used" 661 662 yyp -= yyR2[yyn] 663 // yyp is now the index of $0. Perform the default action. Iff the 664 // reduced production is ε, $1 is possibly out of range. 665 if yyp+1 >= len(yyS) { 666 nyys := make([]yySymType, len(yyS)*2) 667 copy(nyys, yyS) 668 yyS = nyys 669 } 670 yyVAL = yyS[yyp+1] 671 672 /* consult goto table to find next state */ 673 yyn = yyR1[yyn] 674 yyg := yyPgo[yyn] 675 yyj := yyg + yyS[yyp].yys + 1 676 677 if yyj >= yyLast { 678 yystate = yyAct[yyg] 679 } else { 680 yystate = yyAct[yyj] 681 if yyChk[yystate] != -yyn { 682 yystate = yyAct[yyg] 683 } 684 } 685 // dummy call; replaced with literal code 686 switch yynt { 687 688 case 1: 689 yyDollar = yyS[yypt-1 : yypt+1] 690 { 691 if n, ok := expand(yylex, yyDollar[1].expr); ok { 692 yylex.(*lexer).n = n 693 } 694 } 695 case 2: 696 yyDollar = yyS[yypt-1 : yypt+1] 697 { 698 yyVAL.expr.s = "" 699 if n, err := strconv.ParseInt(yyDollar[1].expr.s, 0, 0); err != nil { 700 yylex.Error(fmt.Sprintf("invalid number %q", yyDollar[1].expr.s)) 701 } else { 702 yyVAL.expr.n = int(n) 703 } 704 } 705 case 4: 706 yyDollar = yyS[yypt-3 : yypt+1] 707 { 708 yyVAL.expr = yyDollar[2].expr 709 } 710 case 6: 711 yyDollar = yyS[yypt-2 : yypt+1] 712 { 713 yyVAL.expr.s = "" 714 if yyDollar[1].expr.s == "" { 715 yylex.Error(errLValue(yyDollar[2].op)) 716 } else if n, ok := expand(yylex, yyDollar[1].expr); ok { 717 yyVAL.expr.n = n 718 yylex.(*lexer).env.Set(yyDollar[1].expr.s, strconv.Itoa(yyVAL.expr.n+1)) 719 } 720 } 721 case 7: 722 yyDollar = yyS[yypt-2 : yypt+1] 723 { 724 yyVAL.expr.s = "" 725 if yyDollar[1].expr.s == "" { 726 yylex.Error(errLValue(yyDollar[2].op)) 727 } else if n, ok := expand(yylex, yyDollar[1].expr); ok { 728 yyVAL.expr.n = n 729 yylex.(*lexer).env.Set(yyDollar[1].expr.s, strconv.Itoa(yyVAL.expr.n-1)) 730 } 731 } 732 case 9: 733 yyDollar = yyS[yypt-2 : yypt+1] 734 { 735 yyVAL.expr.s = "" 736 if yyDollar[2].expr.s == "" { 737 yylex.Error(errLValue(yyDollar[1].op)) 738 } else if n, ok := expand(yylex, yyDollar[2].expr); ok { 739 yyVAL.expr.n = n + 1 740 yylex.(*lexer).env.Set(yyDollar[2].expr.s, strconv.Itoa(yyVAL.expr.n)) 741 } 742 } 743 case 10: 744 yyDollar = yyS[yypt-2 : yypt+1] 745 { 746 yyVAL.expr.s = "" 747 if yyDollar[2].expr.s == "" { 748 yylex.Error(errLValue(yyDollar[1].op)) 749 } else if n, ok := expand(yylex, yyDollar[2].expr); ok { 750 yyVAL.expr.n = n - 1 751 yylex.(*lexer).env.Set(yyDollar[2].expr.s, strconv.Itoa(yyVAL.expr.n)) 752 } 753 } 754 case 11: 755 yyDollar = yyS[yypt-2 : yypt+1] 756 { 757 yyVAL.expr.s = "" 758 if n, ok := expand(yylex, yyDollar[2].expr); ok { 759 switch yyDollar[1].op { 760 case "+": 761 yyVAL.expr.n = +n 762 case "-": 763 yyVAL.expr.n = -n 764 case "~": 765 yyVAL.expr.n = ^n 766 case "!": 767 if n == 0 { 768 yyVAL.expr.n = 1 769 } else { 770 yyVAL.expr.n = 0 771 } 772 } 773 } 774 } 775 case 17: 776 yyDollar = yyS[yypt-3 : yypt+1] 777 { 778 yyVAL.expr, _ = calculate(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 779 } 780 case 18: 781 yyDollar = yyS[yypt-3 : yypt+1] 782 { 783 yyVAL.expr, _ = calculate(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 784 } 785 case 19: 786 yyDollar = yyS[yypt-3 : yypt+1] 787 { 788 yyVAL.expr, _ = calculate(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 789 } 790 case 21: 791 yyDollar = yyS[yypt-3 : yypt+1] 792 { 793 yyVAL.expr, _ = calculate(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 794 } 795 case 22: 796 yyDollar = yyS[yypt-3 : yypt+1] 797 { 798 yyVAL.expr, _ = calculate(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 799 } 800 case 24: 801 yyDollar = yyS[yypt-3 : yypt+1] 802 { 803 yyVAL.expr, _ = calculate(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 804 } 805 case 25: 806 yyDollar = yyS[yypt-3 : yypt+1] 807 { 808 yyVAL.expr, _ = calculate(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 809 } 810 case 27: 811 yyDollar = yyS[yypt-3 : yypt+1] 812 { 813 yyVAL.expr = compare(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 814 } 815 case 28: 816 yyDollar = yyS[yypt-3 : yypt+1] 817 { 818 yyVAL.expr = compare(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 819 } 820 case 29: 821 yyDollar = yyS[yypt-3 : yypt+1] 822 { 823 yyVAL.expr = compare(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 824 } 825 case 30: 826 yyDollar = yyS[yypt-3 : yypt+1] 827 { 828 yyVAL.expr = compare(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 829 } 830 case 32: 831 yyDollar = yyS[yypt-3 : yypt+1] 832 { 833 yyVAL.expr = compare(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 834 } 835 case 33: 836 yyDollar = yyS[yypt-3 : yypt+1] 837 { 838 yyVAL.expr = compare(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 839 } 840 case 35: 841 yyDollar = yyS[yypt-3 : yypt+1] 842 { 843 yyVAL.expr, _ = calculate(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 844 } 845 case 37: 846 yyDollar = yyS[yypt-3 : yypt+1] 847 { 848 yyVAL.expr, _ = calculate(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 849 } 850 case 39: 851 yyDollar = yyS[yypt-3 : yypt+1] 852 { 853 yyVAL.expr, _ = calculate(yylex, yyDollar[1].expr, yyDollar[2].op, yyDollar[3].expr) 854 } 855 case 41: 856 yyDollar = yyS[yypt-3 : yypt+1] 857 { 858 yyVAL.expr.n = 0 859 yyVAL.expr.s = "" 860 if l, ok := expand(yylex, yyDollar[1].expr); ok && l != 0 { 861 if r, ok := expand(yylex, yyDollar[3].expr); ok && r != 0 { 862 yyVAL.expr.n = 1 863 } 864 } 865 } 866 case 43: 867 yyDollar = yyS[yypt-3 : yypt+1] 868 { 869 yyVAL.expr.n = 0 870 yyVAL.expr.s = "" 871 if l, ok := expand(yylex, yyDollar[1].expr); ok && l != 0 { 872 yyVAL.expr.n = 1 873 } else if r, ok := expand(yylex, yyDollar[3].expr); ok && r != 0 { 874 yyVAL.expr.n = 1 875 } 876 } 877 case 45: 878 yyDollar = yyS[yypt-5 : yypt+1] 879 { 880 yyVAL.expr.s = "" 881 if l, ok := expand(yylex, yyDollar[1].expr); ok { 882 if l != 0 { 883 yyVAL.expr.n, _ = expand(yylex, yyDollar[3].expr) 884 } else { 885 yyVAL.expr.n, _ = expand(yylex, yyDollar[5].expr) 886 } 887 } 888 } 889 case 47: 890 yyDollar = yyS[yypt-3 : yypt+1] 891 { 892 yyVAL.expr.s = "" 893 if yyDollar[1].expr.s == "" { 894 yylex.Error(errLValue(yyDollar[2].op)) 895 } else { 896 var ok bool 897 if yyDollar[2].op == "=" { 898 yyVAL.expr.n, ok = expand(yylex, yyDollar[3].expr) 899 } else { 900 yyVAL.expr, ok = calculate(yylex, yyDollar[1].expr, yyDollar[2].op[:len(yyDollar[2].op)-1], yyDollar[3].expr) 901 } 902 if ok { 903 yylex.(*lexer).env.Set(yyDollar[1].expr.s, strconv.Itoa(yyVAL.expr.n)) 904 } 905 } 906 } 907 } 908 goto yystack /* stack new state and value */ 909 }