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  }