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  }