gitee.com/KyleChenSource/lib-robot@v1.0.2/robottest/common/interpreter/logic.go (about) 1 // Code generated by goyacc -p logic -v logic.out -o logic.go logic.y. DO NOT EDIT. 2 3 //line logic.y:26 4 5 package interpreter 6 7 import __yyfmt__ "fmt" 8 9 //line logic.y:27 10 11 import ( 12 "bytes" 13 "fmt" 14 "log" 15 "math/rand" 16 "strconv" 17 "unicode/utf8" 18 ) 19 20 var ( 21 LogDebug = func(string, ...any) {} 22 LogInfo = func(string, ...any) {} 23 LogError = func(string, ...any) {} 24 ) 25 26 type exprtype int8 27 28 const ( 29 EXPR_TYPE_STRING exprtype = iota 30 EXPR_TYPE_BOOL 31 EXPR_TYPE_INT 32 EXPR_TYPE_FLOAT 33 EXPR_TYPE_NIL 34 EXPR_TYPE_CNT 35 ) 36 37 func exprGet(v *logicSymType, info string) (any, error) { 38 switch v.expr_type { 39 case EXPR_TYPE_STRING: 40 return v.string_type, nil 41 case EXPR_TYPE_BOOL: 42 return v.bool_type, nil 43 case EXPR_TYPE_INT: 44 return v.int_type, nil 45 case EXPR_TYPE_FLOAT: 46 return v.float_type, nil 47 case EXPR_TYPE_NIL: 48 return nil, nil 49 } 50 51 return nil, fmt.Errorf("%s type:%d", info, v.expr_type) 52 } 53 54 func exprSet(s *logicSymType, d *logicSymType, info string) (err error) { 55 d.expr_type = s.expr_type 56 57 switch s.expr_type { 58 case EXPR_TYPE_STRING: 59 d.string_type = s.string_type 60 case EXPR_TYPE_BOOL: 61 d.bool_type = s.bool_type 62 case EXPR_TYPE_INT: 63 d.int_type = s.int_type 64 case EXPR_TYPE_FLOAT: 65 d.float_type = s.float_type 66 case EXPR_TYPE_NIL: 67 default: 68 err = fmt.Errorf("%s type:%d", info, s.expr_type) 69 } 70 71 return 72 } 73 74 func exprBool(s *logicSymType) bool { 75 switch s.expr_type { 76 case EXPR_TYPE_STRING: 77 return len(s.string_type) > 0 78 case EXPR_TYPE_BOOL: 79 return s.bool_type 80 case EXPR_TYPE_INT: 81 return s.int_type != 0 82 case EXPR_TYPE_FLOAT: 83 return s.float_type != 0 84 } 85 return false 86 } 87 88 func typeGo2Script(v any, s *logicSymType) error { 89 switch v.(type) { 90 case nil: 91 s.expr_type = EXPR_TYPE_NIL 92 case int: 93 s.expr_type = EXPR_TYPE_INT 94 s.int_type = int64(v.(int)) 95 case int8: 96 s.expr_type = EXPR_TYPE_INT 97 s.int_type = int64(v.(int8)) 98 case int16: 99 s.expr_type = EXPR_TYPE_INT 100 s.int_type = int64(v.(int16)) 101 case int32: 102 s.expr_type = EXPR_TYPE_INT 103 s.int_type = int64(v.(int32)) 104 case int64: 105 s.expr_type = EXPR_TYPE_INT 106 s.int_type = v.(int64) 107 case uint8: 108 s.expr_type = EXPR_TYPE_INT 109 s.int_type = int64(v.(uint8)) 110 case uint16: 111 s.expr_type = EXPR_TYPE_INT 112 s.int_type = int64(v.(uint16)) 113 case uint32: 114 s.expr_type = EXPR_TYPE_INT 115 s.int_type = int64(v.(uint32)) 116 case uint64: 117 s.expr_type = EXPR_TYPE_INT 118 s.int_type = int64(v.(uint64)) 119 case float32: 120 s.expr_type = EXPR_TYPE_FLOAT 121 s.float_type = float64(v.(float32)) 122 case float64: 123 s.expr_type = EXPR_TYPE_FLOAT 124 s.float_type = v.(float64) 125 case string: 126 s.expr_type = EXPR_TYPE_STRING 127 s.string_type = v.(string) 128 default: 129 return fmt.Errorf("unrecognized Value %v type:%T", v, v) 130 } 131 return nil 132 } 133 134 //line logic.y:152 135 type logicSymType struct { 136 yys int 137 string_type string 138 bool_type bool 139 int_type int64 140 float_type float64 141 expr_type exprtype 142 } 143 144 const EQ = 57346 145 const LS = 57347 146 const LE = 57348 147 const GT = 57349 148 const GE = 57350 149 const AND = 57351 150 const OR = 57352 151 const NOT = 57353 152 const GET = 57354 153 const SET = 57355 154 const DATA = 57356 155 const RAND = 57357 156 const VARIABLE = 57358 157 158 var logicToknames = [...]string{ 159 "$end", 160 "error", 161 "$unk", 162 "'='", 163 "';'", 164 "'+'", 165 "'-'", 166 "EQ", 167 "LS", 168 "LE", 169 "GT", 170 "GE", 171 "AND", 172 "OR", 173 "NOT", 174 "'('", 175 "')'", 176 "GET", 177 "SET", 178 "'*'", 179 "'/'", 180 "DATA", 181 "RAND", 182 "VARIABLE", 183 } 184 185 var logicStatenames = [...]string{} 186 187 const logicEofCode = 1 188 const logicErrCode = 2 189 const logicInitialStackSize = 16 190 191 //line logic.y:620 192 193 // The parser expects the lexer to return 0 on EOF. Give it a name 194 // for clarity. 195 const eof = 0 196 197 type DataCtx interface { 198 Get(string) (any, bool) 199 Set(string, any) 200 } 201 202 // The parser uses the type <prefix>Lex as a lexer. It must provide 203 // the methods Lex(*<prefix>SymType) int and Error(string). 204 type logicLex struct { 205 line []byte 206 peek rune 207 208 result any // 输出结果 209 err error // 错误信息 210 211 ctx DataCtx 212 length int32 // 外部传入数据,节点长度 213 value any // 外部传入数据,节点数据 214 } 215 216 // The parser calls this method to get each new token. This 217 // implementation returns operators and NUM. 218 func (x *logicLex) Lex(yylval *logicSymType) int { 219 for { 220 c := x.next() 221 LogDebug("c:%q", c) 222 switch c { 223 case eof: 224 return eof 225 case '+', '-', '*', '/', '(', ')', ';': 226 return int(c) 227 case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.': 228 return x.num(c, yylval) 229 case '"': 230 return x.string(c, yylval) 231 case '<': 232 c = x.next() 233 if c != '=' { 234 x.peek = c 235 return LS 236 } 237 return LE 238 case '>': 239 c = x.next() 240 if c != '=' { 241 x.peek = c 242 return GT 243 } 244 return GE 245 case '=': 246 c = x.next() 247 if c != '=' { 248 x.peek = c 249 return int('=') 250 } 251 return EQ 252 253 case '&': 254 c = x.next() 255 if c != '&' { 256 x.err = fmt.Errorf("unrecognized character =%q", c) 257 return eof 258 } 259 return AND 260 case '|': 261 c = x.next() 262 if c != '|' { 263 x.err = fmt.Errorf("unrecognized character =%q", c) 264 return eof 265 } 266 return OR 267 case '!': 268 return NOT 269 // Recognize Unicode multiplication and division 270 // symbols, returning what the parser expects. 271 case ' ', '\t', '\n', '\r': 272 default: 273 if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') { 274 return x.variable(c, yylval) 275 } 276 277 x.err = fmt.Errorf("unrecognized character %q", c) 278 return eof 279 } 280 } 281 } 282 283 // Lex a number. 284 func (x *logicLex) num(c rune, yylval *logicSymType) int { 285 add := func(b *bytes.Buffer, c rune) { 286 if _, x.err = b.WriteRune(c); x.err != nil { 287 log.Fatalf("WriteRune: %s", x.err) 288 } 289 } 290 291 bFloat := false 292 if c == '.' { 293 bFloat = true 294 } 295 296 var b bytes.Buffer 297 298 add(&b, c) 299 L: 300 for { 301 c = x.next() 302 switch c { 303 case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'e', 'E': 304 add(&b, c) 305 case '.': 306 add(&b, c) 307 if bFloat { 308 x.err = fmt.Errorf("%s double .", b.String()) 309 return eof 310 } 311 bFloat = true 312 default: 313 break L 314 } 315 } 316 if c != eof { 317 x.peek = c 318 } 319 320 if !bFloat { 321 var number uint64 322 number, x.err = strconv.ParseUint(b.String(), 10, 64) 323 yylval.expr_type = EXPR_TYPE_INT 324 yylval.int_type = int64(number) 325 if x.err != nil { 326 x.err = fmt.Errorf("%s ParseInt err:%s", b.String(), x.err.Error()) 327 return eof 328 } 329 } else { 330 yylval.float_type, x.err = strconv.ParseFloat(b.String(), 64) 331 if x.err != nil { 332 x.err = fmt.Errorf("%s ParseFloat err:%s", b.String(), x.err.Error()) 333 return eof 334 } 335 yylval.expr_type = EXPR_TYPE_FLOAT 336 } 337 return DATA 338 } 339 340 // Lex a string. 341 func (x *logicLex) string(c rune, yylval *logicSymType) int { 342 add := func(b *bytes.Buffer, c rune) { 343 if _, x.err = b.WriteRune(c); x.err != nil { 344 log.Fatalf("WriteRune: %s", x.err) 345 } 346 } 347 348 var b bytes.Buffer 349 L: 350 for { 351 c = x.next() 352 switch c { 353 case eof: 354 return eof 355 case '"': 356 break L 357 default: 358 add(&b, c) 359 } 360 } 361 362 yylval.expr_type = EXPR_TYPE_STRING 363 yylval.string_type = b.String() 364 365 return DATA 366 } 367 368 // Lex a Value or reserve word. 369 func (x *logicLex) variable(c rune, yylval *logicSymType) int { 370 add := func(b *bytes.Buffer, c rune) { 371 if _, x.err = b.WriteRune(c); x.err != nil { 372 log.Fatalf("value WriteRune: %s", x.err) 373 } 374 } 375 376 var b bytes.Buffer 377 for { 378 if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '_' || (c >= '0' && c <= '9') { 379 add(&b, c) 380 c = x.next() 381 } else { 382 x.peek = c 383 break 384 } 385 } 386 387 s := b.String() 388 switch s { 389 case "Value": 390 err := typeGo2Script(x.value, yylval) 391 if err != nil { 392 x.Error(err.Error()) 393 return eof 394 } 395 return DATA 396 case "Length": 397 yylval.expr_type = EXPR_TYPE_INT 398 yylval.int_type = int64(x.length) 399 return DATA 400 case "None": 401 yylval.expr_type = EXPR_TYPE_BOOL 402 yylval.bool_type = x.value == nil 403 return DATA 404 case "Rand": 405 return RAND 406 case "Get": 407 return GET 408 } 409 410 yylval.expr_type = EXPR_TYPE_STRING 411 yylval.string_type = s 412 return VARIABLE 413 } 414 415 // Return the next rune for the lexer. 416 func (x *logicLex) next() rune { 417 if x.peek != eof { 418 r := x.peek 419 x.peek = eof 420 return r 421 } 422 if len(x.line) == 0 { 423 return eof 424 } 425 c, size := utf8.DecodeRune(x.line) 426 x.line = x.line[size:] 427 if c == utf8.RuneError && size == 1 { 428 x.err = fmt.Errorf("invalid utf8") 429 return x.next() 430 } 431 return c 432 } 433 434 // The parser calls this method on a parse error. 435 func (x *logicLex) Error(s string) { 436 if x.err == nil { 437 x.err = fmt.Errorf("Value:%v Length:%d err:%s", x.value, x.length, s) 438 } else { 439 x.err = fmt.Errorf("%s\nValue:%v Length:%d err:%s", x.err.Error(), x.value, x.length, s) 440 } 441 } 442 443 func DoString(in []byte, v any, l int32, ctx DataCtx) (any, error) { 444 lex := logicLex{line: in, result: false, value: v, length: l, ctx: ctx} 445 446 a := logicParse(&lex) 447 448 LogDebug("value:%v length:%d in:%s a:%d result:%v err:%v", lex.value, lex.length, string(in), a, lex.result, lex.err) 449 450 return lex.result, lex.err 451 } 452 453 //line yacctab:1 454 var logicExca = [...]int8{ 455 -1, 1, 456 1, -1, 457 -2, 0, 458 } 459 460 const logicPrivate = 57344 461 462 const logicLast = 70 463 464 var logicAct = [...]int8{ 465 7, 9, 10, 33, 34, 12, 51, 49, 14, 48, 466 11, 14, 32, 4, 16, 15, 30, 16, 15, 6, 467 9, 10, 36, 41, 42, 43, 44, 45, 50, 11, 468 14, 9, 10, 46, 47, 5, 16, 15, 30, 3, 469 11, 14, 19, 20, 18, 13, 17, 16, 15, 6, 470 26, 22, 23, 24, 25, 38, 39, 37, 8, 21, 471 35, 40, 27, 28, 2, 1, 0, 0, 29, 31, 472 } 473 474 var logicPact = [...]int16{ 475 -5, -1000, 41, -1000, 25, 29, 55, 42, 56, -8, 476 -8, 14, -17, -1000, -8, 0, -1000, 25, -1000, 14, 477 14, 25, 14, 14, 14, 14, 14, -8, -8, 56, 478 -1000, 56, 42, -13, -15, 11, -16, -1000, -1000, -1000, 479 -1000, -1000, -1000, -1000, -1000, -1000, -17, -17, -1000, -1000, 480 -1000, -1000, 481 } 482 483 var logicPgo = [...]int8{ 484 0, 65, 64, 39, 35, 0, 58, 5, 45, 485 } 486 487 var logicR1 = [...]int8{ 488 0, 1, 2, 2, 2, 3, 3, 4, 4, 4, 489 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 490 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 491 } 492 493 var logicR2 = [...]int8{ 494 0, 1, 1, 3, 2, 1, 3, 1, 3, 3, 495 1, 2, 2, 2, 3, 3, 3, 3, 3, 1, 496 3, 3, 1, 3, 3, 3, 1, 1, 3, 1, 497 } 498 499 var logicChk = [...]int16{ 500 -1000, -1, -2, -3, 18, -4, 24, -5, -6, 6, 501 7, 15, -7, -8, 16, 23, 22, 5, -3, 13, 502 14, 4, 9, 10, 11, 12, 8, 6, 7, -6, 503 24, -6, -5, 20, 21, -8, 22, -3, -4, -4, 504 -3, -5, -5, -5, -5, -5, -7, -7, 22, 22, 505 17, 22, 506 } 507 508 var logicDef = [...]int8{ 509 0, -2, 1, 2, 0, 5, 26, 7, 10, 0, 510 0, 0, 19, 22, 0, 27, 29, 0, 4, 0, 511 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 512 26, 12, 13, 0, 0, 0, 0, 3, 8, 9, 513 6, 14, 15, 16, 17, 18, 20, 21, 23, 24, 514 25, 28, 515 } 516 517 var logicTok1 = [...]int8{ 518 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 519 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 520 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 521 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 522 16, 17, 20, 6, 3, 7, 3, 21, 3, 3, 523 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 524 3, 4, 525 } 526 527 var logicTok2 = [...]int8{ 528 2, 3, 8, 9, 10, 11, 12, 13, 14, 15, 529 18, 19, 22, 23, 24, 530 } 531 532 var logicTok3 = [...]int8{ 533 0, 534 } 535 536 var logicErrorMessages = [...]struct { 537 state int 538 token int 539 msg string 540 }{} 541 542 //line yaccpar:1 543 544 /* parser for yacc output */ 545 546 var ( 547 logicDebug = 0 548 logicErrorVerbose = false 549 ) 550 551 type logicLexer interface { 552 Lex(lval *logicSymType) int 553 Error(s string) 554 } 555 556 type logicParser interface { 557 Parse(logicLexer) int 558 Lookahead() int 559 } 560 561 type logicParserImpl struct { 562 lval logicSymType 563 stack [logicInitialStackSize]logicSymType 564 char int 565 } 566 567 func (p *logicParserImpl) Lookahead() int { 568 return p.char 569 } 570 571 func logicNewParser() logicParser { 572 return &logicParserImpl{} 573 } 574 575 const logicFlag = -1000 576 577 func logicTokname(c int) string { 578 if c >= 1 && c-1 < len(logicToknames) { 579 if logicToknames[c-1] != "" { 580 return logicToknames[c-1] 581 } 582 } 583 return __yyfmt__.Sprintf("tok-%v", c) 584 } 585 586 func logicStatname(s int) string { 587 if s >= 0 && s < len(logicStatenames) { 588 if logicStatenames[s] != "" { 589 return logicStatenames[s] 590 } 591 } 592 return __yyfmt__.Sprintf("state-%v", s) 593 } 594 595 func logicErrorMessage(state, lookAhead int) string { 596 const TOKSTART = 4 597 598 if !logicErrorVerbose { 599 return "syntax error" 600 } 601 602 for _, e := range logicErrorMessages { 603 if e.state == state && e.token == lookAhead { 604 return "syntax error: " + e.msg 605 } 606 } 607 608 res := "syntax error: unexpected " + logicTokname(lookAhead) 609 610 // To match Bison, suggest at most four expected tokens. 611 expected := make([]int, 0, 4) 612 613 // Look for shiftable tokens. 614 base := int(logicPact[state]) 615 for tok := TOKSTART; tok-1 < len(logicToknames); tok++ { 616 if n := base + tok; n >= 0 && n < logicLast && int(logicChk[int(logicAct[n])]) == tok { 617 if len(expected) == cap(expected) { 618 return res 619 } 620 expected = append(expected, tok) 621 } 622 } 623 624 if logicDef[state] == -2 { 625 i := 0 626 for logicExca[i] != -1 || int(logicExca[i+1]) != state { 627 i += 2 628 } 629 630 // Look for tokens that we accept or reduce. 631 for i += 2; logicExca[i] >= 0; i += 2 { 632 tok := int(logicExca[i]) 633 if tok < TOKSTART || logicExca[i+1] == 0 { 634 continue 635 } 636 if len(expected) == cap(expected) { 637 return res 638 } 639 expected = append(expected, tok) 640 } 641 642 // If the default action is to accept or reduce, give up. 643 if logicExca[i+1] != 0 { 644 return res 645 } 646 } 647 648 for i, tok := range expected { 649 if i == 0 { 650 res += ", expecting " 651 } else { 652 res += " or " 653 } 654 res += logicTokname(tok) 655 } 656 return res 657 } 658 659 func logiclex1(lex logicLexer, lval *logicSymType) (char, token int) { 660 token = 0 661 char = lex.Lex(lval) 662 if char <= 0 { 663 token = int(logicTok1[0]) 664 goto out 665 } 666 if char < len(logicTok1) { 667 token = int(logicTok1[char]) 668 goto out 669 } 670 if char >= logicPrivate { 671 if char < logicPrivate+len(logicTok2) { 672 token = int(logicTok2[char-logicPrivate]) 673 goto out 674 } 675 } 676 for i := 0; i < len(logicTok3); i += 2 { 677 token = int(logicTok3[i+0]) 678 if token == char { 679 token = int(logicTok3[i+1]) 680 goto out 681 } 682 } 683 684 out: 685 if token == 0 { 686 token = int(logicTok2[1]) /* unknown char */ 687 } 688 if logicDebug >= 3 { 689 __yyfmt__.Printf("lex %s(%d)\n", logicTokname(token), uint(char)) 690 } 691 return char, token 692 } 693 694 func logicParse(logiclex logicLexer) int { 695 return logicNewParser().Parse(logiclex) 696 } 697 698 func (logicrcvr *logicParserImpl) Parse(logiclex logicLexer) int { 699 var logicn int 700 var logicVAL logicSymType 701 var logicDollar []logicSymType 702 _ = logicDollar // silence set and not used 703 logicS := logicrcvr.stack[:] 704 705 Nerrs := 0 /* number of errors */ 706 Errflag := 0 /* error recovery flag */ 707 logicstate := 0 708 logicrcvr.char = -1 709 logictoken := -1 // logicrcvr.char translated into internal numbering 710 defer func() { 711 // Make sure we report no lookahead when not parsing. 712 logicstate = -1 713 logicrcvr.char = -1 714 logictoken = -1 715 }() 716 logicp := -1 717 goto logicstack 718 719 ret0: 720 return 0 721 722 ret1: 723 return 1 724 725 logicstack: 726 /* put a state and value onto the stack */ 727 if logicDebug >= 4 { 728 __yyfmt__.Printf("char %v in %v\n", logicTokname(logictoken), logicStatname(logicstate)) 729 } 730 731 logicp++ 732 if logicp >= len(logicS) { 733 nyys := make([]logicSymType, len(logicS)*2) 734 copy(nyys, logicS) 735 logicS = nyys 736 } 737 logicS[logicp] = logicVAL 738 logicS[logicp].yys = logicstate 739 740 logicnewstate: 741 logicn = int(logicPact[logicstate]) 742 if logicn <= logicFlag { 743 goto logicdefault /* simple state */ 744 } 745 if logicrcvr.char < 0 { 746 logicrcvr.char, logictoken = logiclex1(logiclex, &logicrcvr.lval) 747 } 748 logicn += logictoken 749 if logicn < 0 || logicn >= logicLast { 750 goto logicdefault 751 } 752 logicn = int(logicAct[logicn]) 753 if int(logicChk[logicn]) == logictoken { /* valid shift */ 754 logicrcvr.char = -1 755 logictoken = -1 756 logicVAL = logicrcvr.lval 757 logicstate = logicn 758 if Errflag > 0 { 759 Errflag-- 760 } 761 goto logicstack 762 } 763 764 logicdefault: 765 /* default state action */ 766 logicn = int(logicDef[logicstate]) 767 if logicn == -2 { 768 if logicrcvr.char < 0 { 769 logicrcvr.char, logictoken = logiclex1(logiclex, &logicrcvr.lval) 770 } 771 772 /* look through exception table */ 773 xi := 0 774 for { 775 if logicExca[xi+0] == -1 && int(logicExca[xi+1]) == logicstate { 776 break 777 } 778 xi += 2 779 } 780 for xi += 2; ; xi += 2 { 781 logicn = int(logicExca[xi+0]) 782 if logicn < 0 || logicn == logictoken { 783 break 784 } 785 } 786 logicn = int(logicExca[xi+1]) 787 if logicn < 0 { 788 goto ret0 789 } 790 } 791 if logicn == 0 { 792 /* error ... attempt to resume parsing */ 793 switch Errflag { 794 case 0: /* brand new error */ 795 logiclex.Error(logicErrorMessage(logicstate, logictoken)) 796 Nerrs++ 797 if logicDebug >= 1 { 798 __yyfmt__.Printf("%s", logicStatname(logicstate)) 799 __yyfmt__.Printf(" saw %s\n", logicTokname(logictoken)) 800 } 801 fallthrough 802 803 case 1, 2: /* incompletely recovered error ... try again */ 804 Errflag = 3 805 806 /* find a state where "error" is a legal shift action */ 807 for logicp >= 0 { 808 logicn = int(logicPact[logicS[logicp].yys]) + logicErrCode 809 if logicn >= 0 && logicn < logicLast { 810 logicstate = int(logicAct[logicn]) /* simulate a shift of "error" */ 811 if int(logicChk[logicstate]) == logicErrCode { 812 goto logicstack 813 } 814 } 815 816 /* the current p has no shift on "error", pop stack */ 817 if logicDebug >= 2 { 818 __yyfmt__.Printf("error recovery pops state %d\n", logicS[logicp].yys) 819 } 820 logicp-- 821 } 822 /* there is no state on the stack with an error shift ... abort */ 823 goto ret1 824 825 case 3: /* no shift yet; clobber input char */ 826 if logicDebug >= 2 { 827 __yyfmt__.Printf("error recovery discards %s\n", logicTokname(logictoken)) 828 } 829 if logictoken == logicEofCode { 830 goto ret1 831 } 832 logicrcvr.char = -1 833 logictoken = -1 834 goto logicnewstate /* try again in the same state */ 835 } 836 } 837 838 /* reduction by production logicn */ 839 if logicDebug >= 2 { 840 __yyfmt__.Printf("reduce %v in:\n\t%v\n", logicn, logicStatname(logicstate)) 841 } 842 843 logicnt := logicn 844 logicpt := logicp 845 _ = logicpt // guard against "declared and not used" 846 847 logicp -= int(logicR2[logicn]) 848 // logicp is now the index of $0. Perform the default action. Iff the 849 // reduced production is ε, $1 is possibly out of range. 850 if logicp+1 >= len(logicS) { 851 nyys := make([]logicSymType, len(logicS)*2) 852 copy(nyys, logicS) 853 logicS = nyys 854 } 855 logicVAL = logicS[logicp+1] 856 857 /* consult goto table to find next state */ 858 logicn = int(logicR1[logicn]) 859 logicg := int(logicPgo[logicn]) 860 logicj := logicg + logicS[logicp].yys + 1 861 862 if logicj >= logicLast { 863 logicstate = int(logicAct[logicg]) 864 } else { 865 logicstate = int(logicAct[logicj]) 866 if int(logicChk[logicstate]) != -logicn { 867 logicstate = int(logicAct[logicg]) 868 } 869 } 870 // dummy call; replaced with literal code 871 switch logicnt { 872 873 case 1: 874 logicDollar = logicS[logicpt-1 : logicpt+1] 875 //line logic.y:187 876 { 877 LogDebug("expr.expr0") 878 var err error 879 logiclex.(*logicLex).result, err = exprGet(&logicDollar[1], "expr.expr0") 880 if err != nil { 881 logiclex.(*logicLex).Error(err.Error()) 882 } 883 } 884 case 2: 885 logicDollar = logicS[logicpt-1 : logicpt+1] 886 //line logic.y:197 887 { 888 LogDebug("expr0.expr1") 889 err := exprSet(&logicDollar[1], &logicVAL, "expr0.expr1") 890 if err != nil { 891 logiclex.(*logicLex).Error(err.Error()) 892 } 893 } 894 case 3: 895 logicDollar = logicS[logicpt-3 : logicpt+1] 896 //line logic.y:205 897 { 898 LogDebug("expr0.expr0 ';' expr1") 899 err := exprSet(&logicDollar[3], &logicVAL, "expr0.expr0 ';' expr1") 900 if err != nil { 901 logiclex.(*logicLex).Error(err.Error()) 902 } 903 } 904 case 4: 905 logicDollar = logicS[logicpt-2 : logicpt+1] 906 //line logic.y:213 907 { 908 LogDebug("expr0.GET expr1") 909 if logicDollar[2].expr_type != EXPR_TYPE_STRING { 910 logiclex.(*logicLex).Error(fmt.Sprintf("expr0.GET expr1 $2:%d string need", logicDollar[2].expr_type)) 911 } else { 912 r, ok := logiclex.(*logicLex).ctx.Get(logicDollar[2].string_type) 913 if !ok { 914 logicVAL.expr_type = EXPR_TYPE_NIL 915 } else { 916 err := typeGo2Script(r, &logicVAL) 917 if err != nil { 918 logiclex.(*logicLex).Error(fmt.Sprintf("expr0.GET expr1 typeGo2Script err:%s", err.Error())) 919 } 920 } 921 } 922 } 923 case 5: 924 logicDollar = logicS[logicpt-1 : logicpt+1] 925 //line logic.y:231 926 { 927 LogDebug("expr1.logic") 928 err := exprSet(&logicDollar[1], &logicVAL, "expr1.logic") 929 if err != nil { 930 logiclex.(*logicLex).Error(err.Error()) 931 } 932 } 933 case 6: 934 logicDollar = logicS[logicpt-3 : logicpt+1] 935 //line logic.y:239 936 { 937 LogDebug("expr0.VARIABLE '=' expr1 v:%s", logicDollar[1].string_type) 938 v, err := exprGet(&logicDollar[3], "expr1.VARIABLE '=' expr1") 939 if err != nil { 940 logiclex.(*logicLex).Error(err.Error()) 941 } else { 942 logiclex.(*logicLex).ctx.Set(logicDollar[1].string_type, v) 943 exprSet(&logicDollar[3], &logicVAL, "expr1.VARIABLE '=' expr1") 944 } 945 } 946 case 7: 947 logicDollar = logicS[logicpt-1 : logicpt+1] 948 //line logic.y:251 949 { 950 LogDebug("logic.logic1") 951 err := exprSet(&logicDollar[1], &logicVAL, "logic.logic1") 952 if err != nil { 953 logiclex.(*logicLex).Error(err.Error()) 954 } 955 } 956 case 8: 957 logicDollar = logicS[logicpt-3 : logicpt+1] 958 //line logic.y:259 959 { 960 LogDebug("%v AND %v\n", logicDollar[1].expr_type, logicDollar[3].expr_type) 961 logicVAL.expr_type = EXPR_TYPE_BOOL 962 logicVAL.bool_type = exprBool(&logicDollar[1]) && exprBool(&logicDollar[3]) 963 } 964 case 9: 965 logicDollar = logicS[logicpt-3 : logicpt+1] 966 //line logic.y:265 967 { 968 LogDebug("%v AND %v\n", logicDollar[1].expr_type, logicDollar[3].expr_type) 969 logicVAL.expr_type = EXPR_TYPE_BOOL 970 logicVAL.bool_type = exprBool(&logicDollar[1]) || exprBool(&logicDollar[3]) 971 } 972 case 10: 973 logicDollar = logicS[logicpt-1 : logicpt+1] 974 //line logic.y:272 975 { 976 LogDebug("logic1.calc1") 977 err := exprSet(&logicDollar[1], &logicVAL, "logic1.calc1") 978 if err != nil { 979 logiclex.(*logicLex).Error(err.Error()) 980 } 981 } 982 case 11: 983 logicDollar = logicS[logicpt-2 : logicpt+1] 984 //line logic.y:280 985 { 986 switch logicDollar[1].expr_type { 987 case EXPR_TYPE_INT: 988 logicVAL.expr_type = logicDollar[1].expr_type 989 logicVAL.int_type = logicDollar[1].int_type 990 case EXPR_TYPE_FLOAT: 991 logicVAL.expr_type = logicDollar[1].expr_type 992 logicVAL.float_type = logicDollar[1].float_type 993 default: 994 logiclex.(*logicLex).Error(fmt.Sprintf("logic1.'+' calc1 type:%d", logicDollar[1].expr_type)) 995 } 996 } 997 case 12: 998 logicDollar = logicS[logicpt-2 : logicpt+1] 999 //line logic.y:293 1000 { 1001 switch logicDollar[1].expr_type { 1002 case EXPR_TYPE_INT: 1003 logicVAL.expr_type = logicDollar[1].expr_type 1004 logicVAL.int_type = -logicDollar[1].int_type 1005 case EXPR_TYPE_FLOAT: 1006 logicVAL.expr_type = logicDollar[1].expr_type 1007 logicVAL.float_type = -logicDollar[1].float_type 1008 default: 1009 logiclex.(*logicLex).Error(fmt.Sprintf("logic1.'-' calc1 type:%d", logicDollar[1].expr_type)) 1010 } 1011 } 1012 case 13: 1013 logicDollar = logicS[logicpt-2 : logicpt+1] 1014 //line logic.y:306 1015 { 1016 LogDebug("NOT %v\n", logicDollar[2].expr_type) 1017 logicVAL.expr_type = EXPR_TYPE_BOOL 1018 logicVAL.bool_type = !exprBool(&logicDollar[2]) 1019 } 1020 case 14: 1021 logicDollar = logicS[logicpt-3 : logicpt+1] 1022 //line logic.y:312 1023 { 1024 LogDebug("LS NUM\n") 1025 1026 logicVAL.expr_type = EXPR_TYPE_BOOL 1027 if logicDollar[1].expr_type == EXPR_TYPE_INT { 1028 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1029 logicVAL.bool_type = logicDollar[1].int_type < logicDollar[3].int_type 1030 } 1031 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1032 logicVAL.bool_type = float64(logicDollar[1].int_type) < logicDollar[3].float_type 1033 } 1034 } else if logicDollar[1].expr_type == EXPR_TYPE_FLOAT { 1035 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1036 logicVAL.bool_type = logicDollar[1].float_type < float64(logicDollar[3].int_type) 1037 } 1038 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1039 logicVAL.bool_type = logicDollar[1].float_type < logicDollar[3].float_type 1040 } 1041 } else { 1042 logicVAL.expr_type = EXPR_TYPE_NIL 1043 logiclex.(*logicLex).Error(fmt.Sprintf("logic1.logic1 LS logic1 type:%d - %d", logicDollar[1].expr_type, logicDollar[3].expr_type)) 1044 } 1045 } 1046 case 15: 1047 logicDollar = logicS[logicpt-3 : logicpt+1] 1048 //line logic.y:336 1049 { 1050 LogDebug("LE NUM\n") 1051 logicVAL.expr_type = EXPR_TYPE_BOOL 1052 if logicDollar[1].expr_type == EXPR_TYPE_INT { 1053 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1054 logicVAL.bool_type = logicDollar[1].int_type <= logicDollar[3].int_type 1055 } 1056 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1057 logicVAL.bool_type = float64(logicDollar[1].int_type) <= logicDollar[3].float_type 1058 } 1059 } else if logicDollar[1].expr_type == EXPR_TYPE_FLOAT { 1060 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1061 logicVAL.bool_type = logicDollar[1].float_type <= float64(logicDollar[3].int_type) 1062 } 1063 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1064 logicVAL.bool_type = logicDollar[1].float_type <= logicDollar[3].float_type 1065 } 1066 } else { 1067 logicVAL.expr_type = EXPR_TYPE_NIL 1068 logiclex.(*logicLex).Error(fmt.Sprintf("logic1.logic1 LE logic1 type:%d - %d", logicDollar[1].expr_type, logicDollar[3].expr_type)) 1069 } 1070 } 1071 case 16: 1072 logicDollar = logicS[logicpt-3 : logicpt+1] 1073 //line logic.y:359 1074 { 1075 LogDebug("GT NUM\n") 1076 logicVAL.expr_type = EXPR_TYPE_BOOL 1077 if logicDollar[1].expr_type == EXPR_TYPE_INT { 1078 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1079 logicVAL.bool_type = logicDollar[1].int_type > logicDollar[3].int_type 1080 } 1081 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1082 logicVAL.bool_type = float64(logicDollar[1].int_type) > logicDollar[3].float_type 1083 } 1084 } else if logicDollar[1].expr_type == EXPR_TYPE_FLOAT { 1085 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1086 logicVAL.bool_type = logicDollar[1].float_type > float64(logicDollar[3].int_type) 1087 } 1088 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1089 logicVAL.bool_type = logicDollar[1].float_type > logicDollar[3].float_type 1090 } 1091 } else { 1092 logicVAL.expr_type = EXPR_TYPE_NIL 1093 logiclex.(*logicLex).Error(fmt.Sprintf("logic1.logic1 GT logic1 type:%d - %d", logicDollar[1].expr_type, logicDollar[3].expr_type)) 1094 } 1095 } 1096 case 17: 1097 logicDollar = logicS[logicpt-3 : logicpt+1] 1098 //line logic.y:382 1099 { 1100 LogDebug("GE NUM\n") 1101 logicVAL.expr_type = EXPR_TYPE_BOOL 1102 if logicDollar[1].expr_type == EXPR_TYPE_INT { 1103 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1104 logicVAL.bool_type = logicDollar[1].int_type >= logicDollar[3].int_type 1105 } 1106 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1107 logicVAL.bool_type = float64(logicDollar[1].int_type) >= logicDollar[3].float_type 1108 } 1109 } else if logicDollar[1].expr_type == EXPR_TYPE_FLOAT { 1110 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1111 logicVAL.bool_type = logicDollar[1].float_type >= float64(logicDollar[3].int_type) 1112 } 1113 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1114 logicVAL.bool_type = logicDollar[1].float_type >= logicDollar[3].float_type 1115 } 1116 } else { 1117 logicVAL.expr_type = EXPR_TYPE_NIL 1118 logiclex.(*logicLex).Error(fmt.Sprintf("logic1.logic1 GE logic1 type:%d - %d", logicDollar[1].expr_type, logicDollar[3].expr_type)) 1119 } 1120 } 1121 case 18: 1122 logicDollar = logicS[logicpt-3 : logicpt+1] 1123 //line logic.y:405 1124 { 1125 LogDebug("EQ NUM\n") 1126 logicVAL.expr_type = EXPR_TYPE_BOOL 1127 if logicDollar[1].expr_type == EXPR_TYPE_INT { 1128 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1129 logicVAL.bool_type = logicDollar[1].int_type == logicDollar[3].int_type 1130 } 1131 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1132 logicVAL.bool_type = float64(logicDollar[1].int_type) == logicDollar[3].float_type 1133 } 1134 } else if logicDollar[1].expr_type == EXPR_TYPE_FLOAT { 1135 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1136 logicVAL.bool_type = logicDollar[1].float_type == float64(logicDollar[3].int_type) 1137 } 1138 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1139 logicVAL.bool_type = logicDollar[1].float_type == logicDollar[3].float_type 1140 } 1141 } else if logicDollar[1].expr_type == EXPR_TYPE_BOOL && logicDollar[3].expr_type == EXPR_TYPE_BOOL { 1142 logicVAL.bool_type = logicDollar[1].bool_type == logicDollar[3].bool_type 1143 } else if logicDollar[1].expr_type == EXPR_TYPE_STRING && logicDollar[3].expr_type == EXPR_TYPE_STRING { 1144 logicVAL.bool_type = logicDollar[1].string_type == logicDollar[3].string_type 1145 } else { 1146 logicVAL.expr_type = EXPR_TYPE_NIL 1147 logiclex.(*logicLex).Error(fmt.Sprintf("logic1.logic1 EQ logic1 type:%d - %d", logicDollar[1].expr_type, logicDollar[3].expr_type)) 1148 } 1149 } 1150 case 19: 1151 logicDollar = logicS[logicpt-1 : logicpt+1] 1152 //line logic.y:433 1153 { 1154 LogDebug("calc1.calc2") 1155 err := exprSet(&logicDollar[1], &logicVAL, "calc1.calc2") 1156 if err != nil { 1157 logiclex.(*logicLex).Error(err.Error()) 1158 } 1159 } 1160 case 20: 1161 logicDollar = logicS[logicpt-3 : logicpt+1] 1162 //line logic.y:441 1163 { 1164 if logicDollar[1].expr_type == EXPR_TYPE_INT { 1165 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1166 logicVAL.expr_type = EXPR_TYPE_INT 1167 logicVAL.int_type = logicDollar[1].int_type + logicDollar[3].int_type 1168 LogDebug("calc1.calc1 '+' calc2 int+int %d+%d=%d", logicDollar[1].int_type, logicDollar[3].int_type, logicVAL.int_type) 1169 } 1170 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1171 logicVAL.expr_type = EXPR_TYPE_FLOAT 1172 logicVAL.float_type = float64(logicDollar[1].int_type) + logicDollar[3].float_type 1173 LogDebug("calc1.calc1 '+' calc2 int+float %d+%f=%f", logicDollar[1].int_type, logicDollar[3].float_type, logicVAL.float_type) 1174 } 1175 } else if logicDollar[1].expr_type == EXPR_TYPE_FLOAT { 1176 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1177 logicVAL.expr_type = EXPR_TYPE_FLOAT 1178 logicVAL.float_type = logicDollar[1].float_type + float64(logicDollar[3].int_type) 1179 LogDebug("calc1.calc1 '+' calc2 float+int %f+%d=%f", logicDollar[1].float_type, logicDollar[3].int_type, logicVAL.float_type) 1180 } 1181 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1182 logicVAL.expr_type = EXPR_TYPE_FLOAT 1183 logicVAL.float_type = logicDollar[1].float_type + logicDollar[3].float_type 1184 LogDebug("calc1.calc1 '+' calc2 float+float %f+%f=%f", logicDollar[1].float_type, logicDollar[3].float_type, logicVAL.float_type) 1185 } 1186 } else if logicDollar[1].expr_type == EXPR_TYPE_STRING && logicDollar[3].expr_type == EXPR_TYPE_STRING { 1187 logicVAL.expr_type = EXPR_TYPE_STRING 1188 logicVAL.string_type = logicDollar[1].string_type + logicDollar[3].string_type 1189 LogDebug("calc1.calc1 '+' calc2 string %s+%s=%s", logicDollar[1].string_type, logicDollar[3].string_type, logicVAL.string_type) 1190 } else if logicDollar[1].expr_type == EXPR_TYPE_STRING && logicDollar[3].expr_type == EXPR_TYPE_INT { 1191 logicVAL.expr_type = EXPR_TYPE_STRING 1192 logicVAL.string_type = fmt.Sprintf("%s%d", logicDollar[1].string_type, logicDollar[3].int_type) 1193 LogDebug("calc1.calc1 '+' calc2 string %s+%d=%s", logicDollar[1].string_type, logicDollar[3].int_type, logicVAL.string_type) 1194 } else if logicDollar[1].expr_type == EXPR_TYPE_STRING && logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1195 logicVAL.expr_type = EXPR_TYPE_STRING 1196 logicVAL.string_type = fmt.Sprintf("%s%f", logicDollar[1].string_type, logicDollar[3].float_type) 1197 LogDebug("calc1.calc1 '+' calc2 string %s+%f=%s", logicDollar[1].string_type, logicDollar[3].float_type, logicVAL.string_type) 1198 } else { 1199 logicVAL.expr_type = EXPR_TYPE_NIL 1200 logiclex.(*logicLex).Error(fmt.Sprintf("logic1.calc1 '+' calc2 type:%d - %d", logicDollar[1].expr_type, logicDollar[3].expr_type)) 1201 LogDebug("calc1.calc1 '+' calc2 type:%d, %d", logicDollar[1].expr_type, logicDollar[3].expr_type) 1202 } 1203 } 1204 case 21: 1205 logicDollar = logicS[logicpt-3 : logicpt+1] 1206 //line logic.y:483 1207 { 1208 if logicDollar[1].expr_type == EXPR_TYPE_INT { 1209 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1210 logicVAL.expr_type = EXPR_TYPE_INT 1211 logicVAL.int_type = logicDollar[1].int_type - logicDollar[3].int_type 1212 } 1213 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1214 logicVAL.expr_type = EXPR_TYPE_FLOAT 1215 logicVAL.float_type = float64(logicDollar[1].int_type) - logicDollar[3].float_type 1216 } 1217 } else if logicDollar[1].expr_type == EXPR_TYPE_FLOAT { 1218 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1219 logicVAL.expr_type = EXPR_TYPE_FLOAT 1220 logicVAL.float_type = logicDollar[1].float_type - float64(logicDollar[3].int_type) 1221 } 1222 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1223 logicVAL.expr_type = EXPR_TYPE_FLOAT 1224 logicVAL.float_type = logicDollar[1].float_type - logicDollar[3].float_type 1225 } 1226 } else { 1227 logicVAL.expr_type = EXPR_TYPE_NIL 1228 logiclex.(*logicLex).Error(fmt.Sprintf("logic1.calc1 '-' calc2 type:%d - %d", logicDollar[1].expr_type, logicDollar[3].expr_type)) 1229 } 1230 } 1231 case 22: 1232 logicDollar = logicS[logicpt-1 : logicpt+1] 1233 //line logic.y:509 1234 { 1235 LogDebug("calc2.calc3") 1236 err := exprSet(&logicDollar[1], &logicVAL, "calc1.calc2") 1237 if err != nil { 1238 logiclex.(*logicLex).Error(err.Error()) 1239 } 1240 } 1241 case 23: 1242 logicDollar = logicS[logicpt-3 : logicpt+1] 1243 //line logic.y:517 1244 { 1245 if logicDollar[1].expr_type == EXPR_TYPE_INT { 1246 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1247 logicVAL.expr_type = EXPR_TYPE_INT 1248 logicVAL.int_type = logicDollar[1].int_type * logicDollar[3].int_type 1249 } 1250 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1251 logicVAL.expr_type = EXPR_TYPE_FLOAT 1252 logicVAL.float_type = float64(logicDollar[1].int_type) * logicDollar[3].float_type 1253 } 1254 } else if logicDollar[1].expr_type == EXPR_TYPE_FLOAT { 1255 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1256 logicVAL.expr_type = EXPR_TYPE_FLOAT 1257 logicVAL.float_type = logicDollar[1].float_type * float64(logicDollar[3].int_type) 1258 } 1259 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1260 logicVAL.expr_type = EXPR_TYPE_FLOAT 1261 logicVAL.float_type = logicDollar[1].float_type * logicDollar[3].float_type 1262 } 1263 } else { 1264 logicVAL.expr_type = EXPR_TYPE_NIL 1265 logiclex.(*logicLex).Error(fmt.Sprintf("logic1.calc1 '*' calc2 type:%d - %d", logicDollar[1].expr_type, logicDollar[3].expr_type)) 1266 } 1267 } 1268 case 24: 1269 logicDollar = logicS[logicpt-3 : logicpt+1] 1270 //line logic.y:542 1271 { 1272 if logicDollar[1].expr_type == EXPR_TYPE_INT { 1273 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1274 logicVAL.expr_type = EXPR_TYPE_INT 1275 logicVAL.int_type = logicDollar[1].int_type / logicDollar[3].int_type 1276 } 1277 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1278 logicVAL.expr_type = EXPR_TYPE_FLOAT 1279 logicVAL.float_type = float64(logicDollar[1].int_type) / logicDollar[3].float_type 1280 } 1281 } else if logicDollar[1].expr_type == EXPR_TYPE_FLOAT { 1282 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1283 logicVAL.expr_type = EXPR_TYPE_FLOAT 1284 logicVAL.float_type = logicDollar[1].float_type / float64(logicDollar[3].int_type) 1285 } 1286 if logicDollar[3].expr_type == EXPR_TYPE_FLOAT { 1287 logicVAL.expr_type = EXPR_TYPE_FLOAT 1288 logicVAL.float_type = logicDollar[1].float_type / logicDollar[3].float_type 1289 } 1290 } else { 1291 logicVAL.expr_type = EXPR_TYPE_NIL 1292 logiclex.(*logicLex).Error(fmt.Sprintf("logic1.calc1 '/' calc2 type:%d - %d", logicDollar[1].expr_type, logicDollar[3].expr_type)) 1293 } 1294 } 1295 case 25: 1296 logicDollar = logicS[logicpt-3 : logicpt+1] 1297 //line logic.y:568 1298 { 1299 err := exprSet(&logicDollar[2], &logicVAL, "calc3.'(' calc3 ')'") 1300 if err != nil { 1301 logiclex.(*logicLex).Error(err.Error()) 1302 } 1303 } 1304 case 26: 1305 logicDollar = logicS[logicpt-1 : logicpt+1] 1306 //line logic.y:575 1307 { 1308 LogDebug("calc3.VARIABLE %s", logicDollar[1].string_type) 1309 r, ok := logiclex.(*logicLex).ctx.Get(logicDollar[1].string_type) 1310 if !ok { 1311 logicVAL.expr_type = EXPR_TYPE_NIL 1312 } else { 1313 err := typeGo2Script(r, &logicVAL) 1314 if err != nil { 1315 logiclex.(*logicLex).Error(fmt.Sprintf("calc3.VARIABLE v:%s err:%s", logicDollar[1].string_type, err.Error())) 1316 } 1317 } 1318 } 1319 case 27: 1320 logicDollar = logicS[logicpt-1 : logicpt+1] 1321 //line logic.y:588 1322 { 1323 LogDebug("calc3.RAND") 1324 logicVAL.expr_type = EXPR_TYPE_INT 1325 logicVAL.int_type = rand.Int63() 1326 LogDebug("RAND:%d\n", logicVAL.int_type) 1327 } 1328 case 28: 1329 logicDollar = logicS[logicpt-3 : logicpt+1] 1330 //line logic.y:595 1331 { 1332 min := int64(0) 1333 if logicDollar[2].expr_type == EXPR_TYPE_INT { 1334 min = logicDollar[2].int_type 1335 } else { 1336 min = int64(logicDollar[2].float_type) 1337 } 1338 max := int64(0) 1339 if logicDollar[3].expr_type == EXPR_TYPE_INT { 1340 max = logicDollar[3].int_type 1341 } else { 1342 max = int64(logicDollar[3].float_type) 1343 } 1344 logicVAL.expr_type = EXPR_TYPE_INT 1345 logicVAL.int_type = rand.Int63n(max-min) + min 1346 LogDebug("RAND (%d %d):%d\n", min, max, logicVAL.int_type) 1347 } 1348 case 29: 1349 logicDollar = logicS[logicpt-1 : logicpt+1] 1350 //line logic.y:613 1351 { 1352 LogDebug("calc3.DATA") 1353 err := exprSet(&logicDollar[1], &logicVAL, "calc3.DATA") 1354 if err != nil { 1355 logiclex.(*logicLex).Error(err.Error()) 1356 } 1357 } 1358 } 1359 goto logicstack /* stack new state and value */ 1360 }