github.com/assemblaj/gopher-lua@v0.0.0-20221116224352-d57295a0d9e8/parse/parser.go (about)

     1  // Code generated by goyacc -o parser.go parser.go.y. DO NOT EDIT.
     2  
     3  //line parser.go.y:2
     4  package parse
     5  
     6  import __yyfmt__ "fmt"
     7  
     8  //line parser.go.y:2
     9  
    10  import (
    11  	"github.com/assemblaj/gopher-lua/ast"
    12  )
    13  
    14  //line parser.go.y:34
    15  type yySymType struct {
    16  	yys   int
    17  	token ast.Token
    18  
    19  	stmts []ast.Stmt
    20  	stmt  ast.Stmt
    21  
    22  	funcname *ast.FuncName
    23  	funcexpr *ast.FunctionExpr
    24  
    25  	exprlist []ast.Expr
    26  	expr     ast.Expr
    27  
    28  	fieldlist []*ast.Field
    29  	field     *ast.Field
    30  	fieldsep  string
    31  
    32  	namelist []string
    33  	parlist  *ast.ParList
    34  }
    35  
    36  const TAnd = 57346
    37  const TBreak = 57347
    38  const TDo = 57348
    39  const TElse = 57349
    40  const TElseIf = 57350
    41  const TEnd = 57351
    42  const TFalse = 57352
    43  const TFor = 57353
    44  const TFunction = 57354
    45  const TIf = 57355
    46  const TIn = 57356
    47  const TLocal = 57357
    48  const TNil = 57358
    49  const TNot = 57359
    50  const TOr = 57360
    51  const TReturn = 57361
    52  const TRepeat = 57362
    53  const TThen = 57363
    54  const TTrue = 57364
    55  const TUntil = 57365
    56  const TWhile = 57366
    57  const TEqeq = 57367
    58  const TNeq = 57368
    59  const TLte = 57369
    60  const TGte = 57370
    61  const T2Comma = 57371
    62  const T3Comma = 57372
    63  const TIdent = 57373
    64  const TNumber = 57374
    65  const TString = 57375
    66  const UNARY = 57376
    67  
    68  var yyToknames = [...]string{
    69  	"$end",
    70  	"error",
    71  	"$unk",
    72  	"TAnd",
    73  	"TBreak",
    74  	"TDo",
    75  	"TElse",
    76  	"TElseIf",
    77  	"TEnd",
    78  	"TFalse",
    79  	"TFor",
    80  	"TFunction",
    81  	"TIf",
    82  	"TIn",
    83  	"TLocal",
    84  	"TNil",
    85  	"TNot",
    86  	"TOr",
    87  	"TReturn",
    88  	"TRepeat",
    89  	"TThen",
    90  	"TTrue",
    91  	"TUntil",
    92  	"TWhile",
    93  	"TEqeq",
    94  	"TNeq",
    95  	"TLte",
    96  	"TGte",
    97  	"T2Comma",
    98  	"T3Comma",
    99  	"TIdent",
   100  	"TNumber",
   101  	"TString",
   102  	"'{'",
   103  	"'('",
   104  	"'>'",
   105  	"'<'",
   106  	"'+'",
   107  	"'-'",
   108  	"'*'",
   109  	"'/'",
   110  	"'%'",
   111  	"UNARY",
   112  	"'^'",
   113  	"';'",
   114  	"'='",
   115  	"','",
   116  	"':'",
   117  	"'.'",
   118  	"'['",
   119  	"']'",
   120  	"'#'",
   121  	"')'",
   122  	"'}'",
   123  }
   124  
   125  var yyStatenames = [...]string{}
   126  
   127  const yyEofCode = 1
   128  const yyErrCode = 2
   129  const yyInitialStackSize = 16
   130  
   131  //line parser.go.y:517
   132  
   133  func TokenName(c int) string {
   134  	if c >= TAnd && c-TAnd < len(yyToknames) {
   135  		if yyToknames[c-TAnd] != "" {
   136  			return yyToknames[c-TAnd]
   137  		}
   138  	}
   139  	return string([]byte{byte(c)})
   140  }
   141  
   142  //line yacctab:1
   143  var yyExca = [...]int8{
   144  	-1, 1,
   145  	1, -1,
   146  	-2, 0,
   147  	-1, 17,
   148  	46, 31,
   149  	47, 31,
   150  	-2, 68,
   151  	-1, 93,
   152  	46, 32,
   153  	47, 32,
   154  	-2, 68,
   155  }
   156  
   157  const yyPrivate = 57344
   158  
   159  const yyLast = 579
   160  
   161  var yyAct = [...]uint8{
   162  	24, 88, 50, 23, 45, 84, 56, 65, 137, 153,
   163  	136, 113, 52, 142, 54, 53, 33, 134, 65, 132,
   164  	62, 63, 32, 61, 108, 109, 48, 111, 106, 41,
   165  	42, 105, 49, 155, 166, 81, 82, 83, 138, 104,
   166  	22, 91, 131, 80, 95, 92, 162, 74, 48, 85,
   167  	150, 99, 165, 148, 49, 149, 75, 76, 77, 78,
   168  	79, 67, 80, 107, 106, 148, 114, 115, 116, 117,
   169  	118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
   170  	128, 129, 72, 73, 71, 70, 74, 65, 39, 40,
   171  	47, 139, 133, 68, 69, 75, 76, 77, 78, 79,
   172  	60, 80, 141, 144, 143, 146, 145, 31, 67, 147,
   173  	9, 48, 110, 97, 48, 152, 151, 49, 38, 62,
   174  	49, 17, 66, 77, 78, 79, 96, 80, 59, 72,
   175  	73, 71, 70, 74, 154, 102, 91, 156, 55, 157,
   176  	68, 69, 75, 76, 77, 78, 79, 21, 80, 187,
   177  	94, 20, 26, 184, 37, 179, 163, 112, 25, 35,
   178  	178, 93, 170, 172, 27, 171, 164, 173, 19, 159,
   179  	175, 174, 29, 89, 28, 39, 40, 20, 182, 181,
   180  	100, 34, 135, 183, 67, 39, 40, 47, 186, 64,
   181  	51, 1, 90, 87, 36, 130, 86, 30, 66, 18,
   182  	46, 44, 43, 8, 58, 72, 73, 71, 70, 74,
   183  	57, 67, 168, 169, 167, 3, 68, 69, 75, 76,
   184  	77, 78, 79, 160, 80, 66, 4, 2, 0, 0,
   185  	0, 158, 72, 73, 71, 70, 74, 0, 0, 0,
   186  	0, 0, 0, 68, 69, 75, 76, 77, 78, 79,
   187  	26, 80, 37, 0, 0, 0, 25, 35, 140, 0,
   188  	0, 0, 27, 0, 0, 0, 0, 0, 0, 0,
   189  	29, 21, 28, 39, 40, 20, 26, 0, 37, 34,
   190  	0, 0, 25, 35, 0, 0, 0, 0, 27, 0,
   191  	0, 0, 36, 98, 0, 0, 29, 89, 28, 39,
   192  	40, 20, 26, 0, 37, 34, 0, 0, 25, 35,
   193  	0, 0, 0, 0, 27, 67, 90, 176, 36, 0,
   194  	0, 0, 29, 21, 28, 39, 40, 20, 0, 66,
   195  	0, 34, 0, 0, 0, 0, 72, 73, 71, 70,
   196  	74, 0, 67, 0, 36, 0, 0, 68, 69, 75,
   197  	76, 77, 78, 79, 0, 80, 66, 0, 177, 0,
   198  	0, 0, 0, 72, 73, 71, 70, 74, 0, 67,
   199  	0, 185, 0, 0, 68, 69, 75, 76, 77, 78,
   200  	79, 0, 80, 66, 0, 161, 0, 0, 0, 0,
   201  	72, 73, 71, 70, 74, 0, 67, 0, 0, 0,
   202  	0, 68, 69, 75, 76, 77, 78, 79, 0, 80,
   203  	66, 0, 0, 180, 0, 0, 0, 72, 73, 71,
   204  	70, 74, 0, 67, 0, 0, 0, 0, 68, 69,
   205  	75, 76, 77, 78, 79, 0, 80, 66, 0, 0,
   206  	103, 0, 0, 0, 72, 73, 71, 70, 74, 0,
   207  	67, 0, 101, 0, 0, 68, 69, 75, 76, 77,
   208  	78, 79, 0, 80, 66, 0, 0, 0, 0, 0,
   209  	0, 72, 73, 71, 70, 74, 0, 67, 0, 0,
   210  	0, 0, 68, 69, 75, 76, 77, 78, 79, 0,
   211  	80, 66, 0, 0, 0, 0, 0, 0, 72, 73,
   212  	71, 70, 74, 0, 0, 0, 0, 0, 0, 68,
   213  	69, 75, 76, 77, 78, 79, 0, 80, 72, 73,
   214  	71, 70, 74, 0, 0, 0, 0, 0, 0, 68,
   215  	69, 75, 76, 77, 78, 79, 0, 80, 7, 10,
   216  	0, 0, 0, 0, 14, 15, 13, 0, 16, 0,
   217  	0, 0, 6, 12, 0, 0, 0, 11, 0, 0,
   218  	0, 0, 0, 0, 21, 0, 0, 0, 20, 0,
   219  	0, 0, 0, 0, 0, 0, 0, 0, 5,
   220  }
   221  
   222  var yyPact = [...]int16{
   223  	-1000, -1000, 533, -5, -1000, -1000, 292, -1000, -17, 152,
   224  	-1000, 292, -1000, 292, 107, 97, 88, -1000, -1000, -1000,
   225  	292, -1000, -1000, -29, 473, -1000, -1000, -1000, -1000, -1000,
   226  	-1000, 152, -1000, -1000, 292, 292, 292, 14, -1000, -1000,
   227  	142, 292, 116, 292, 95, -1000, 82, 240, -1000, -1000,
   228  	171, -1000, 446, 112, 419, -7, 17, 14, -24, -1000,
   229  	81, -19, -1000, 104, -42, 292, 292, 292, 292, 292,
   230  	292, 292, 292, 292, 292, 292, 292, 292, 292, 292,
   231  	292, -1, -1, -1, -1000, -11, -1000, -37, -1000, -8,
   232  	292, 473, -29, -1000, 152, 207, -1000, 55, -1000, -40,
   233  	-1000, -1000, 292, -1000, 292, 292, 34, -1000, 24, 19,
   234  	14, 292, -1000, -1000, 473, 57, 493, 18, 18, 18,
   235  	18, 18, 18, 18, 83, 83, -1, -1, -1, -1,
   236  	-44, -1000, -1000, -14, -1000, 266, -1000, -1000, 292, 180,
   237  	-1000, -1000, -1000, 160, 473, -1000, 338, 40, -1000, -1000,
   238  	-1000, -1000, -29, -1000, 157, 22, -1000, 473, -12, -1000,
   239  	205, 292, -1000, 154, -1000, -1000, 292, -1000, -1000, 292,
   240  	311, 151, -1000, 473, 146, 392, -1000, 292, -1000, -1000,
   241  	-1000, 144, 365, -1000, -1000, -1000, 140, -1000,
   242  }
   243  
   244  var yyPgo = [...]uint8{
   245  	0, 190, 227, 2, 226, 223, 215, 210, 204, 203,
   246  	118, 6, 3, 0, 22, 107, 168, 199, 4, 197,
   247  	5, 195, 16, 193, 1, 182,
   248  }
   249  
   250  var yyR1 = [...]int8{
   251  	0, 1, 1, 1, 2, 2, 2, 3, 4, 4,
   252  	4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
   253  	4, 4, 5, 5, 6, 6, 6, 7, 7, 8,
   254  	8, 9, 9, 10, 10, 10, 11, 11, 12, 12,
   255  	13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
   256  	13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
   257  	13, 13, 13, 13, 13, 13, 13, 14, 15, 15,
   258  	15, 15, 17, 16, 16, 18, 18, 18, 18, 19,
   259  	20, 20, 21, 21, 21, 22, 22, 23, 23, 23,
   260  	24, 24, 24, 25, 25,
   261  }
   262  
   263  var yyR2 = [...]int8{
   264  	0, 1, 2, 3, 0, 2, 2, 1, 3, 1,
   265  	3, 5, 4, 6, 8, 9, 11, 7, 3, 4,
   266  	4, 2, 0, 5, 1, 2, 1, 1, 3, 1,
   267  	3, 1, 3, 1, 4, 3, 1, 3, 1, 3,
   268  	1, 1, 1, 1, 1, 1, 1, 1, 1, 3,
   269  	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   270  	3, 3, 3, 3, 2, 2, 2, 1, 1, 1,
   271  	1, 3, 3, 2, 4, 2, 3, 1, 1, 2,
   272  	5, 4, 1, 1, 3, 2, 3, 1, 3, 2,
   273  	3, 5, 1, 1, 1,
   274  }
   275  
   276  var yyChk = [...]int16{
   277  	-1000, -1, -2, -6, -4, 45, 19, 5, -9, -15,
   278  	6, 24, 20, 13, 11, 12, 15, -10, -17, -16,
   279  	35, 31, 45, -12, -13, 16, 10, 22, 32, 30,
   280  	-19, -15, -14, -22, 39, 17, 52, 12, -10, 33,
   281  	34, 46, 47, 50, 49, -18, 48, 35, -22, -14,
   282  	-3, -1, -13, -3, -13, 31, -11, -7, -8, 31,
   283  	12, -11, 31, -13, -16, 47, 18, 4, 36, 37,
   284  	28, 27, 25, 26, 29, 38, 39, 40, 41, 42,
   285  	44, -13, -13, -13, -20, 35, 54, -23, -24, 31,
   286  	50, -13, -12, -10, -15, -13, 31, 31, 53, -12,
   287  	9, 6, 23, 21, 46, 14, 47, -20, 48, 49,
   288  	31, 46, 53, 53, -13, -13, -13, -13, -13, -13,
   289  	-13, -13, -13, -13, -13, -13, -13, -13, -13, -13,
   290  	-21, 53, 30, -11, 54, -25, 47, 45, 46, -13,
   291  	51, -18, 53, -3, -13, -3, -13, -12, 31, 31,
   292  	31, -20, -12, 53, -3, 47, -24, -13, 51, 9,
   293  	-5, 47, 6, -3, 9, 30, 46, 9, 7, 8,
   294  	-13, -3, 9, -13, -3, -13, 6, 47, 9, 9,
   295  	21, -3, -13, -3, 9, 6, -3, 9,
   296  }
   297  
   298  var yyDef = [...]int8{
   299  	4, -2, 1, 2, 5, 6, 24, 26, 0, 9,
   300  	4, 0, 4, 0, 0, 0, 0, -2, 69, 70,
   301  	0, 33, 3, 25, 38, 40, 41, 42, 43, 44,
   302  	45, 46, 47, 48, 0, 0, 0, 0, 68, 67,
   303  	0, 0, 0, 0, 0, 73, 0, 0, 77, 78,
   304  	0, 7, 0, 0, 0, 36, 0, 0, 27, 29,
   305  	0, 21, 36, 0, 70, 0, 0, 0, 0, 0,
   306  	0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   307  	0, 64, 65, 66, 79, 0, 85, 0, 87, 33,
   308  	0, 92, 8, -2, 0, 0, 35, 0, 75, 0,
   309  	10, 4, 0, 4, 0, 0, 0, 18, 0, 0,
   310  	0, 0, 71, 72, 39, 49, 50, 51, 52, 53,
   311  	54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
   312  	0, 4, 82, 83, 86, 89, 93, 94, 0, 0,
   313  	34, 74, 76, 0, 12, 22, 0, 0, 37, 28,
   314  	30, 19, 20, 4, 0, 0, 88, 90, 0, 11,
   315  	0, 0, 4, 0, 81, 84, 0, 13, 4, 0,
   316  	0, 0, 80, 91, 0, 0, 4, 0, 17, 14,
   317  	4, 0, 0, 23, 15, 4, 0, 16,
   318  }
   319  
   320  var yyTok1 = [...]int8{
   321  	1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   322  	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   323  	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   324  	3, 3, 3, 3, 3, 52, 3, 42, 3, 3,
   325  	35, 53, 40, 38, 47, 39, 49, 41, 3, 3,
   326  	3, 3, 3, 3, 3, 3, 3, 3, 48, 45,
   327  	37, 46, 36, 3, 3, 3, 3, 3, 3, 3,
   328  	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   329  	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   330  	3, 50, 3, 51, 44, 3, 3, 3, 3, 3,
   331  	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   332  	3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
   333  	3, 3, 3, 34, 3, 54,
   334  }
   335  
   336  var yyTok2 = [...]int8{
   337  	2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
   338  	12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
   339  	22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
   340  	32, 33, 43,
   341  }
   342  
   343  var yyTok3 = [...]int8{
   344  	0,
   345  }
   346  
   347  var yyErrorMessages = [...]struct {
   348  	state int
   349  	token int
   350  	msg   string
   351  }{}
   352  
   353  //line yaccpar:1
   354  
   355  /*	parser for yacc output	*/
   356  
   357  var (
   358  	yyDebug        = 0
   359  	yyErrorVerbose = false
   360  )
   361  
   362  type yyLexer interface {
   363  	Lex(lval *yySymType) int
   364  	Error(s string)
   365  }
   366  
   367  type yyParser interface {
   368  	Parse(yyLexer) int
   369  	Lookahead() int
   370  }
   371  
   372  type yyParserImpl struct {
   373  	lval  yySymType
   374  	stack [yyInitialStackSize]yySymType
   375  	char  int
   376  }
   377  
   378  func (p *yyParserImpl) Lookahead() int {
   379  	return p.char
   380  }
   381  
   382  func yyNewParser() yyParser {
   383  	return &yyParserImpl{}
   384  }
   385  
   386  const yyFlag = -1000
   387  
   388  func yyTokname(c int) string {
   389  	if c >= 1 && c-1 < len(yyToknames) {
   390  		if yyToknames[c-1] != "" {
   391  			return yyToknames[c-1]
   392  		}
   393  	}
   394  	return __yyfmt__.Sprintf("tok-%v", c)
   395  }
   396  
   397  func yyStatname(s int) string {
   398  	if s >= 0 && s < len(yyStatenames) {
   399  		if yyStatenames[s] != "" {
   400  			return yyStatenames[s]
   401  		}
   402  	}
   403  	return __yyfmt__.Sprintf("state-%v", s)
   404  }
   405  
   406  func yyErrorMessage(state, lookAhead int) string {
   407  	const TOKSTART = 4
   408  
   409  	if !yyErrorVerbose {
   410  		return "syntax error"
   411  	}
   412  
   413  	for _, e := range yyErrorMessages {
   414  		if e.state == state && e.token == lookAhead {
   415  			return "syntax error: " + e.msg
   416  		}
   417  	}
   418  
   419  	res := "syntax error: unexpected " + yyTokname(lookAhead)
   420  
   421  	// To match Bison, suggest at most four expected tokens.
   422  	expected := make([]int, 0, 4)
   423  
   424  	// Look for shiftable tokens.
   425  	base := int(yyPact[state])
   426  	for tok := TOKSTART; tok-1 < len(yyToknames); tok++ {
   427  		if n := base + tok; n >= 0 && n < yyLast && int(yyChk[int(yyAct[n])]) == tok {
   428  			if len(expected) == cap(expected) {
   429  				return res
   430  			}
   431  			expected = append(expected, tok)
   432  		}
   433  	}
   434  
   435  	if yyDef[state] == -2 {
   436  		i := 0
   437  		for yyExca[i] != -1 || int(yyExca[i+1]) != state {
   438  			i += 2
   439  		}
   440  
   441  		// Look for tokens that we accept or reduce.
   442  		for i += 2; yyExca[i] >= 0; i += 2 {
   443  			tok := int(yyExca[i])
   444  			if tok < TOKSTART || yyExca[i+1] == 0 {
   445  				continue
   446  			}
   447  			if len(expected) == cap(expected) {
   448  				return res
   449  			}
   450  			expected = append(expected, tok)
   451  		}
   452  
   453  		// If the default action is to accept or reduce, give up.
   454  		if yyExca[i+1] != 0 {
   455  			return res
   456  		}
   457  	}
   458  
   459  	for i, tok := range expected {
   460  		if i == 0 {
   461  			res += ", expecting "
   462  		} else {
   463  			res += " or "
   464  		}
   465  		res += yyTokname(tok)
   466  	}
   467  	return res
   468  }
   469  
   470  func yylex1(lex yyLexer, lval *yySymType) (char, token int) {
   471  	token = 0
   472  	char = lex.Lex(lval)
   473  	if char <= 0 {
   474  		token = int(yyTok1[0])
   475  		goto out
   476  	}
   477  	if char < len(yyTok1) {
   478  		token = int(yyTok1[char])
   479  		goto out
   480  	}
   481  	if char >= yyPrivate {
   482  		if char < yyPrivate+len(yyTok2) {
   483  			token = int(yyTok2[char-yyPrivate])
   484  			goto out
   485  		}
   486  	}
   487  	for i := 0; i < len(yyTok3); i += 2 {
   488  		token = int(yyTok3[i+0])
   489  		if token == char {
   490  			token = int(yyTok3[i+1])
   491  			goto out
   492  		}
   493  	}
   494  
   495  out:
   496  	if token == 0 {
   497  		token = int(yyTok2[1]) /* unknown char */
   498  	}
   499  	if yyDebug >= 3 {
   500  		__yyfmt__.Printf("lex %s(%d)\n", yyTokname(token), uint(char))
   501  	}
   502  	return char, token
   503  }
   504  
   505  func yyParse(yylex yyLexer) int {
   506  	return yyNewParser().Parse(yylex)
   507  }
   508  
   509  func (yyrcvr *yyParserImpl) Parse(yylex yyLexer) int {
   510  	var yyn int
   511  	var yyVAL yySymType
   512  	var yyDollar []yySymType
   513  	_ = yyDollar // silence set and not used
   514  	yyS := yyrcvr.stack[:]
   515  
   516  	Nerrs := 0   /* number of errors */
   517  	Errflag := 0 /* error recovery flag */
   518  	yystate := 0
   519  	yyrcvr.char = -1
   520  	yytoken := -1 // yyrcvr.char translated into internal numbering
   521  	defer func() {
   522  		// Make sure we report no lookahead when not parsing.
   523  		yystate = -1
   524  		yyrcvr.char = -1
   525  		yytoken = -1
   526  	}()
   527  	yyp := -1
   528  	goto yystack
   529  
   530  ret0:
   531  	return 0
   532  
   533  ret1:
   534  	return 1
   535  
   536  yystack:
   537  	/* put a state and value onto the stack */
   538  	if yyDebug >= 4 {
   539  		__yyfmt__.Printf("char %v in %v\n", yyTokname(yytoken), yyStatname(yystate))
   540  	}
   541  
   542  	yyp++
   543  	if yyp >= len(yyS) {
   544  		nyys := make([]yySymType, len(yyS)*2)
   545  		copy(nyys, yyS)
   546  		yyS = nyys
   547  	}
   548  	yyS[yyp] = yyVAL
   549  	yyS[yyp].yys = yystate
   550  
   551  yynewstate:
   552  	yyn = int(yyPact[yystate])
   553  	if yyn <= yyFlag {
   554  		goto yydefault /* simple state */
   555  	}
   556  	if yyrcvr.char < 0 {
   557  		yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval)
   558  	}
   559  	yyn += yytoken
   560  	if yyn < 0 || yyn >= yyLast {
   561  		goto yydefault
   562  	}
   563  	yyn = int(yyAct[yyn])
   564  	if int(yyChk[yyn]) == yytoken { /* valid shift */
   565  		yyrcvr.char = -1
   566  		yytoken = -1
   567  		yyVAL = yyrcvr.lval
   568  		yystate = yyn
   569  		if Errflag > 0 {
   570  			Errflag--
   571  		}
   572  		goto yystack
   573  	}
   574  
   575  yydefault:
   576  	/* default state action */
   577  	yyn = int(yyDef[yystate])
   578  	if yyn == -2 {
   579  		if yyrcvr.char < 0 {
   580  			yyrcvr.char, yytoken = yylex1(yylex, &yyrcvr.lval)
   581  		}
   582  
   583  		/* look through exception table */
   584  		xi := 0
   585  		for {
   586  			if yyExca[xi+0] == -1 && int(yyExca[xi+1]) == yystate {
   587  				break
   588  			}
   589  			xi += 2
   590  		}
   591  		for xi += 2; ; xi += 2 {
   592  			yyn = int(yyExca[xi+0])
   593  			if yyn < 0 || yyn == yytoken {
   594  				break
   595  			}
   596  		}
   597  		yyn = int(yyExca[xi+1])
   598  		if yyn < 0 {
   599  			goto ret0
   600  		}
   601  	}
   602  	if yyn == 0 {
   603  		/* error ... attempt to resume parsing */
   604  		switch Errflag {
   605  		case 0: /* brand new error */
   606  			yylex.Error(yyErrorMessage(yystate, yytoken))
   607  			Nerrs++
   608  			if yyDebug >= 1 {
   609  				__yyfmt__.Printf("%s", yyStatname(yystate))
   610  				__yyfmt__.Printf(" saw %s\n", yyTokname(yytoken))
   611  			}
   612  			fallthrough
   613  
   614  		case 1, 2: /* incompletely recovered error ... try again */
   615  			Errflag = 3
   616  
   617  			/* find a state where "error" is a legal shift action */
   618  			for yyp >= 0 {
   619  				yyn = int(yyPact[yyS[yyp].yys]) + yyErrCode
   620  				if yyn >= 0 && yyn < yyLast {
   621  					yystate = int(yyAct[yyn]) /* simulate a shift of "error" */
   622  					if int(yyChk[yystate]) == yyErrCode {
   623  						goto yystack
   624  					}
   625  				}
   626  
   627  				/* the current p has no shift on "error", pop stack */
   628  				if yyDebug >= 2 {
   629  					__yyfmt__.Printf("error recovery pops state %d\n", yyS[yyp].yys)
   630  				}
   631  				yyp--
   632  			}
   633  			/* there is no state on the stack with an error shift ... abort */
   634  			goto ret1
   635  
   636  		case 3: /* no shift yet; clobber input char */
   637  			if yyDebug >= 2 {
   638  				__yyfmt__.Printf("error recovery discards %s\n", yyTokname(yytoken))
   639  			}
   640  			if yytoken == yyEofCode {
   641  				goto ret1
   642  			}
   643  			yyrcvr.char = -1
   644  			yytoken = -1
   645  			goto yynewstate /* try again in the same state */
   646  		}
   647  	}
   648  
   649  	/* reduction by production yyn */
   650  	if yyDebug >= 2 {
   651  		__yyfmt__.Printf("reduce %v in:\n\t%v\n", yyn, yyStatname(yystate))
   652  	}
   653  
   654  	yynt := yyn
   655  	yypt := yyp
   656  	_ = yypt // guard against "declared and not used"
   657  
   658  	yyp -= int(yyR2[yyn])
   659  	// yyp is now the index of $0. Perform the default action. Iff the
   660  	// reduced production is ε, $1 is possibly out of range.
   661  	if yyp+1 >= len(yyS) {
   662  		nyys := make([]yySymType, len(yyS)*2)
   663  		copy(nyys, yyS)
   664  		yyS = nyys
   665  	}
   666  	yyVAL = yyS[yyp+1]
   667  
   668  	/* consult goto table to find next state */
   669  	yyn = int(yyR1[yyn])
   670  	yyg := int(yyPgo[yyn])
   671  	yyj := yyg + yyS[yyp].yys + 1
   672  
   673  	if yyj >= yyLast {
   674  		yystate = int(yyAct[yyg])
   675  	} else {
   676  		yystate = int(yyAct[yyj])
   677  		if int(yyChk[yystate]) != -yyn {
   678  			yystate = int(yyAct[yyg])
   679  		}
   680  	}
   681  	// dummy call; replaced with literal code
   682  	switch yynt {
   683  
   684  	case 1:
   685  		yyDollar = yyS[yypt-1 : yypt+1]
   686  //line parser.go.y:73
   687  		{
   688  			yyVAL.stmts = yyDollar[1].stmts
   689  			if l, ok := yylex.(*Lexer); ok {
   690  				l.Stmts = yyVAL.stmts
   691  			}
   692  		}
   693  	case 2:
   694  		yyDollar = yyS[yypt-2 : yypt+1]
   695  //line parser.go.y:79
   696  		{
   697  			yyVAL.stmts = append(yyDollar[1].stmts, yyDollar[2].stmt)
   698  			if l, ok := yylex.(*Lexer); ok {
   699  				l.Stmts = yyVAL.stmts
   700  			}
   701  		}
   702  	case 3:
   703  		yyDollar = yyS[yypt-3 : yypt+1]
   704  //line parser.go.y:85
   705  		{
   706  			yyVAL.stmts = append(yyDollar[1].stmts, yyDollar[2].stmt)
   707  			if l, ok := yylex.(*Lexer); ok {
   708  				l.Stmts = yyVAL.stmts
   709  			}
   710  		}
   711  	case 4:
   712  		yyDollar = yyS[yypt-0 : yypt+1]
   713  //line parser.go.y:93
   714  		{
   715  			yyVAL.stmts = []ast.Stmt{}
   716  		}
   717  	case 5:
   718  		yyDollar = yyS[yypt-2 : yypt+1]
   719  //line parser.go.y:96
   720  		{
   721  			yyVAL.stmts = append(yyDollar[1].stmts, yyDollar[2].stmt)
   722  		}
   723  	case 6:
   724  		yyDollar = yyS[yypt-2 : yypt+1]
   725  //line parser.go.y:99
   726  		{
   727  			yyVAL.stmts = yyDollar[1].stmts
   728  		}
   729  	case 7:
   730  		yyDollar = yyS[yypt-1 : yypt+1]
   731  //line parser.go.y:104
   732  		{
   733  			yyVAL.stmts = yyDollar[1].stmts
   734  		}
   735  	case 8:
   736  		yyDollar = yyS[yypt-3 : yypt+1]
   737  //line parser.go.y:109
   738  		{
   739  			yyVAL.stmt = &ast.AssignStmt{Lhs: yyDollar[1].exprlist, Rhs: yyDollar[3].exprlist}
   740  			yyVAL.stmt.SetLine(yyDollar[1].exprlist[0].Line())
   741  		}
   742  	case 9:
   743  		yyDollar = yyS[yypt-1 : yypt+1]
   744  //line parser.go.y:114
   745  		{
   746  			if _, ok := yyDollar[1].expr.(*ast.FuncCallExpr); !ok {
   747  				yylex.(*Lexer).Error("parse error")
   748  			} else {
   749  				yyVAL.stmt = &ast.FuncCallStmt{Expr: yyDollar[1].expr}
   750  				yyVAL.stmt.SetLine(yyDollar[1].expr.Line())
   751  			}
   752  		}
   753  	case 10:
   754  		yyDollar = yyS[yypt-3 : yypt+1]
   755  //line parser.go.y:122
   756  		{
   757  			yyVAL.stmt = &ast.DoBlockStmt{Stmts: yyDollar[2].stmts}
   758  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   759  			yyVAL.stmt.SetLastLine(yyDollar[3].token.Pos.Line)
   760  		}
   761  	case 11:
   762  		yyDollar = yyS[yypt-5 : yypt+1]
   763  //line parser.go.y:127
   764  		{
   765  			yyVAL.stmt = &ast.WhileStmt{Condition: yyDollar[2].expr, Stmts: yyDollar[4].stmts}
   766  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   767  			yyVAL.stmt.SetLastLine(yyDollar[5].token.Pos.Line)
   768  		}
   769  	case 12:
   770  		yyDollar = yyS[yypt-4 : yypt+1]
   771  //line parser.go.y:132
   772  		{
   773  			yyVAL.stmt = &ast.RepeatStmt{Condition: yyDollar[4].expr, Stmts: yyDollar[2].stmts}
   774  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   775  			yyVAL.stmt.SetLastLine(yyDollar[4].expr.Line())
   776  		}
   777  	case 13:
   778  		yyDollar = yyS[yypt-6 : yypt+1]
   779  //line parser.go.y:137
   780  		{
   781  			yyVAL.stmt = &ast.IfStmt{Condition: yyDollar[2].expr, Then: yyDollar[4].stmts}
   782  			cur := yyVAL.stmt
   783  			for _, elseif := range yyDollar[5].stmts {
   784  				cur.(*ast.IfStmt).Else = []ast.Stmt{elseif}
   785  				cur = elseif
   786  			}
   787  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   788  			yyVAL.stmt.SetLastLine(yyDollar[6].token.Pos.Line)
   789  		}
   790  	case 14:
   791  		yyDollar = yyS[yypt-8 : yypt+1]
   792  //line parser.go.y:147
   793  		{
   794  			yyVAL.stmt = &ast.IfStmt{Condition: yyDollar[2].expr, Then: yyDollar[4].stmts}
   795  			cur := yyVAL.stmt
   796  			for _, elseif := range yyDollar[5].stmts {
   797  				cur.(*ast.IfStmt).Else = []ast.Stmt{elseif}
   798  				cur = elseif
   799  			}
   800  			cur.(*ast.IfStmt).Else = yyDollar[7].stmts
   801  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   802  			yyVAL.stmt.SetLastLine(yyDollar[8].token.Pos.Line)
   803  		}
   804  	case 15:
   805  		yyDollar = yyS[yypt-9 : yypt+1]
   806  //line parser.go.y:158
   807  		{
   808  			yyVAL.stmt = &ast.NumberForStmt{Name: yyDollar[2].token.Str, Init: yyDollar[4].expr, Limit: yyDollar[6].expr, Stmts: yyDollar[8].stmts}
   809  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   810  			yyVAL.stmt.SetLastLine(yyDollar[9].token.Pos.Line)
   811  		}
   812  	case 16:
   813  		yyDollar = yyS[yypt-11 : yypt+1]
   814  //line parser.go.y:163
   815  		{
   816  			yyVAL.stmt = &ast.NumberForStmt{Name: yyDollar[2].token.Str, Init: yyDollar[4].expr, Limit: yyDollar[6].expr, Step: yyDollar[8].expr, Stmts: yyDollar[10].stmts}
   817  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   818  			yyVAL.stmt.SetLastLine(yyDollar[11].token.Pos.Line)
   819  		}
   820  	case 17:
   821  		yyDollar = yyS[yypt-7 : yypt+1]
   822  //line parser.go.y:168
   823  		{
   824  			yyVAL.stmt = &ast.GenericForStmt{Names: yyDollar[2].namelist, Exprs: yyDollar[4].exprlist, Stmts: yyDollar[6].stmts}
   825  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   826  			yyVAL.stmt.SetLastLine(yyDollar[7].token.Pos.Line)
   827  		}
   828  	case 18:
   829  		yyDollar = yyS[yypt-3 : yypt+1]
   830  //line parser.go.y:173
   831  		{
   832  			yyVAL.stmt = &ast.FuncDefStmt{Name: yyDollar[2].funcname, Func: yyDollar[3].funcexpr}
   833  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   834  			yyVAL.stmt.SetLastLine(yyDollar[3].funcexpr.LastLine())
   835  		}
   836  	case 19:
   837  		yyDollar = yyS[yypt-4 : yypt+1]
   838  //line parser.go.y:178
   839  		{
   840  			yyVAL.stmt = &ast.LocalAssignStmt{Names: []string{yyDollar[3].token.Str}, Exprs: []ast.Expr{yyDollar[4].funcexpr}}
   841  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   842  			yyVAL.stmt.SetLastLine(yyDollar[4].funcexpr.LastLine())
   843  		}
   844  	case 20:
   845  		yyDollar = yyS[yypt-4 : yypt+1]
   846  //line parser.go.y:183
   847  		{
   848  			yyVAL.stmt = &ast.LocalAssignStmt{Names: yyDollar[2].namelist, Exprs: yyDollar[4].exprlist}
   849  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   850  		}
   851  	case 21:
   852  		yyDollar = yyS[yypt-2 : yypt+1]
   853  //line parser.go.y:187
   854  		{
   855  			yyVAL.stmt = &ast.LocalAssignStmt{Names: yyDollar[2].namelist, Exprs: []ast.Expr{}}
   856  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   857  		}
   858  	case 22:
   859  		yyDollar = yyS[yypt-0 : yypt+1]
   860  //line parser.go.y:193
   861  		{
   862  			yyVAL.stmts = []ast.Stmt{}
   863  		}
   864  	case 23:
   865  		yyDollar = yyS[yypt-5 : yypt+1]
   866  //line parser.go.y:196
   867  		{
   868  			yyVAL.stmts = append(yyDollar[1].stmts, &ast.IfStmt{Condition: yyDollar[3].expr, Then: yyDollar[5].stmts})
   869  			yyVAL.stmts[len(yyVAL.stmts)-1].SetLine(yyDollar[2].token.Pos.Line)
   870  		}
   871  	case 24:
   872  		yyDollar = yyS[yypt-1 : yypt+1]
   873  //line parser.go.y:202
   874  		{
   875  			yyVAL.stmt = &ast.ReturnStmt{Exprs: nil}
   876  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   877  		}
   878  	case 25:
   879  		yyDollar = yyS[yypt-2 : yypt+1]
   880  //line parser.go.y:206
   881  		{
   882  			yyVAL.stmt = &ast.ReturnStmt{Exprs: yyDollar[2].exprlist}
   883  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   884  		}
   885  	case 26:
   886  		yyDollar = yyS[yypt-1 : yypt+1]
   887  //line parser.go.y:210
   888  		{
   889  			yyVAL.stmt = &ast.BreakStmt{}
   890  			yyVAL.stmt.SetLine(yyDollar[1].token.Pos.Line)
   891  		}
   892  	case 27:
   893  		yyDollar = yyS[yypt-1 : yypt+1]
   894  //line parser.go.y:216
   895  		{
   896  			yyVAL.funcname = yyDollar[1].funcname
   897  		}
   898  	case 28:
   899  		yyDollar = yyS[yypt-3 : yypt+1]
   900  //line parser.go.y:219
   901  		{
   902  			yyVAL.funcname = &ast.FuncName{Func: nil, Receiver: yyDollar[1].funcname.Func, Method: yyDollar[3].token.Str}
   903  		}
   904  	case 29:
   905  		yyDollar = yyS[yypt-1 : yypt+1]
   906  //line parser.go.y:224
   907  		{
   908  			yyVAL.funcname = &ast.FuncName{Func: &ast.IdentExpr{Value: yyDollar[1].token.Str}}
   909  			yyVAL.funcname.Func.SetLine(yyDollar[1].token.Pos.Line)
   910  		}
   911  	case 30:
   912  		yyDollar = yyS[yypt-3 : yypt+1]
   913  //line parser.go.y:228
   914  		{
   915  			key := &ast.StringExpr{Value: yyDollar[3].token.Str}
   916  			key.SetLine(yyDollar[3].token.Pos.Line)
   917  			fn := &ast.AttrGetExpr{Object: yyDollar[1].funcname.Func, Key: key}
   918  			fn.SetLine(yyDollar[3].token.Pos.Line)
   919  			yyVAL.funcname = &ast.FuncName{Func: fn}
   920  		}
   921  	case 31:
   922  		yyDollar = yyS[yypt-1 : yypt+1]
   923  //line parser.go.y:237
   924  		{
   925  			yyVAL.exprlist = []ast.Expr{yyDollar[1].expr}
   926  		}
   927  	case 32:
   928  		yyDollar = yyS[yypt-3 : yypt+1]
   929  //line parser.go.y:240
   930  		{
   931  			yyVAL.exprlist = append(yyDollar[1].exprlist, yyDollar[3].expr)
   932  		}
   933  	case 33:
   934  		yyDollar = yyS[yypt-1 : yypt+1]
   935  //line parser.go.y:245
   936  		{
   937  			yyVAL.expr = &ast.IdentExpr{Value: yyDollar[1].token.Str}
   938  			yyVAL.expr.SetLine(yyDollar[1].token.Pos.Line)
   939  		}
   940  	case 34:
   941  		yyDollar = yyS[yypt-4 : yypt+1]
   942  //line parser.go.y:249
   943  		{
   944  			yyVAL.expr = &ast.AttrGetExpr{Object: yyDollar[1].expr, Key: yyDollar[3].expr}
   945  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
   946  		}
   947  	case 35:
   948  		yyDollar = yyS[yypt-3 : yypt+1]
   949  //line parser.go.y:253
   950  		{
   951  			key := &ast.StringExpr{Value: yyDollar[3].token.Str}
   952  			key.SetLine(yyDollar[3].token.Pos.Line)
   953  			yyVAL.expr = &ast.AttrGetExpr{Object: yyDollar[1].expr, Key: key}
   954  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
   955  		}
   956  	case 36:
   957  		yyDollar = yyS[yypt-1 : yypt+1]
   958  //line parser.go.y:261
   959  		{
   960  			yyVAL.namelist = []string{yyDollar[1].token.Str}
   961  		}
   962  	case 37:
   963  		yyDollar = yyS[yypt-3 : yypt+1]
   964  //line parser.go.y:264
   965  		{
   966  			yyVAL.namelist = append(yyDollar[1].namelist, yyDollar[3].token.Str)
   967  		}
   968  	case 38:
   969  		yyDollar = yyS[yypt-1 : yypt+1]
   970  //line parser.go.y:269
   971  		{
   972  			yyVAL.exprlist = []ast.Expr{yyDollar[1].expr}
   973  		}
   974  	case 39:
   975  		yyDollar = yyS[yypt-3 : yypt+1]
   976  //line parser.go.y:272
   977  		{
   978  			yyVAL.exprlist = append(yyDollar[1].exprlist, yyDollar[3].expr)
   979  		}
   980  	case 40:
   981  		yyDollar = yyS[yypt-1 : yypt+1]
   982  //line parser.go.y:277
   983  		{
   984  			yyVAL.expr = &ast.NilExpr{}
   985  			yyVAL.expr.SetLine(yyDollar[1].token.Pos.Line)
   986  		}
   987  	case 41:
   988  		yyDollar = yyS[yypt-1 : yypt+1]
   989  //line parser.go.y:281
   990  		{
   991  			yyVAL.expr = &ast.FalseExpr{}
   992  			yyVAL.expr.SetLine(yyDollar[1].token.Pos.Line)
   993  		}
   994  	case 42:
   995  		yyDollar = yyS[yypt-1 : yypt+1]
   996  //line parser.go.y:285
   997  		{
   998  			yyVAL.expr = &ast.TrueExpr{}
   999  			yyVAL.expr.SetLine(yyDollar[1].token.Pos.Line)
  1000  		}
  1001  	case 43:
  1002  		yyDollar = yyS[yypt-1 : yypt+1]
  1003  //line parser.go.y:289
  1004  		{
  1005  			yyVAL.expr = &ast.NumberExpr{Value: yyDollar[1].token.Str}
  1006  			yyVAL.expr.SetLine(yyDollar[1].token.Pos.Line)
  1007  		}
  1008  	case 44:
  1009  		yyDollar = yyS[yypt-1 : yypt+1]
  1010  //line parser.go.y:293
  1011  		{
  1012  			yyVAL.expr = &ast.Comma3Expr{}
  1013  			yyVAL.expr.SetLine(yyDollar[1].token.Pos.Line)
  1014  		}
  1015  	case 45:
  1016  		yyDollar = yyS[yypt-1 : yypt+1]
  1017  //line parser.go.y:297
  1018  		{
  1019  			yyVAL.expr = yyDollar[1].expr
  1020  		}
  1021  	case 46:
  1022  		yyDollar = yyS[yypt-1 : yypt+1]
  1023  //line parser.go.y:300
  1024  		{
  1025  			yyVAL.expr = yyDollar[1].expr
  1026  		}
  1027  	case 47:
  1028  		yyDollar = yyS[yypt-1 : yypt+1]
  1029  //line parser.go.y:303
  1030  		{
  1031  			yyVAL.expr = yyDollar[1].expr
  1032  		}
  1033  	case 48:
  1034  		yyDollar = yyS[yypt-1 : yypt+1]
  1035  //line parser.go.y:306
  1036  		{
  1037  			yyVAL.expr = yyDollar[1].expr
  1038  		}
  1039  	case 49:
  1040  		yyDollar = yyS[yypt-3 : yypt+1]
  1041  //line parser.go.y:309
  1042  		{
  1043  			yyVAL.expr = &ast.LogicalOpExpr{Lhs: yyDollar[1].expr, Operator: "or", Rhs: yyDollar[3].expr}
  1044  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1045  		}
  1046  	case 50:
  1047  		yyDollar = yyS[yypt-3 : yypt+1]
  1048  //line parser.go.y:313
  1049  		{
  1050  			yyVAL.expr = &ast.LogicalOpExpr{Lhs: yyDollar[1].expr, Operator: "and", Rhs: yyDollar[3].expr}
  1051  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1052  		}
  1053  	case 51:
  1054  		yyDollar = yyS[yypt-3 : yypt+1]
  1055  //line parser.go.y:317
  1056  		{
  1057  			yyVAL.expr = &ast.RelationalOpExpr{Lhs: yyDollar[1].expr, Operator: ">", Rhs: yyDollar[3].expr}
  1058  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1059  		}
  1060  	case 52:
  1061  		yyDollar = yyS[yypt-3 : yypt+1]
  1062  //line parser.go.y:321
  1063  		{
  1064  			yyVAL.expr = &ast.RelationalOpExpr{Lhs: yyDollar[1].expr, Operator: "<", Rhs: yyDollar[3].expr}
  1065  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1066  		}
  1067  	case 53:
  1068  		yyDollar = yyS[yypt-3 : yypt+1]
  1069  //line parser.go.y:325
  1070  		{
  1071  			yyVAL.expr = &ast.RelationalOpExpr{Lhs: yyDollar[1].expr, Operator: ">=", Rhs: yyDollar[3].expr}
  1072  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1073  		}
  1074  	case 54:
  1075  		yyDollar = yyS[yypt-3 : yypt+1]
  1076  //line parser.go.y:329
  1077  		{
  1078  			yyVAL.expr = &ast.RelationalOpExpr{Lhs: yyDollar[1].expr, Operator: "<=", Rhs: yyDollar[3].expr}
  1079  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1080  		}
  1081  	case 55:
  1082  		yyDollar = yyS[yypt-3 : yypt+1]
  1083  //line parser.go.y:333
  1084  		{
  1085  			yyVAL.expr = &ast.RelationalOpExpr{Lhs: yyDollar[1].expr, Operator: "==", Rhs: yyDollar[3].expr}
  1086  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1087  		}
  1088  	case 56:
  1089  		yyDollar = yyS[yypt-3 : yypt+1]
  1090  //line parser.go.y:337
  1091  		{
  1092  			yyVAL.expr = &ast.RelationalOpExpr{Lhs: yyDollar[1].expr, Operator: "~=", Rhs: yyDollar[3].expr}
  1093  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1094  		}
  1095  	case 57:
  1096  		yyDollar = yyS[yypt-3 : yypt+1]
  1097  //line parser.go.y:341
  1098  		{
  1099  			yyVAL.expr = &ast.StringConcatOpExpr{Lhs: yyDollar[1].expr, Rhs: yyDollar[3].expr}
  1100  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1101  		}
  1102  	case 58:
  1103  		yyDollar = yyS[yypt-3 : yypt+1]
  1104  //line parser.go.y:345
  1105  		{
  1106  			yyVAL.expr = &ast.ArithmeticOpExpr{Lhs: yyDollar[1].expr, Operator: "+", Rhs: yyDollar[3].expr}
  1107  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1108  		}
  1109  	case 59:
  1110  		yyDollar = yyS[yypt-3 : yypt+1]
  1111  //line parser.go.y:349
  1112  		{
  1113  			yyVAL.expr = &ast.ArithmeticOpExpr{Lhs: yyDollar[1].expr, Operator: "-", Rhs: yyDollar[3].expr}
  1114  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1115  		}
  1116  	case 60:
  1117  		yyDollar = yyS[yypt-3 : yypt+1]
  1118  //line parser.go.y:353
  1119  		{
  1120  			yyVAL.expr = &ast.ArithmeticOpExpr{Lhs: yyDollar[1].expr, Operator: "*", Rhs: yyDollar[3].expr}
  1121  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1122  		}
  1123  	case 61:
  1124  		yyDollar = yyS[yypt-3 : yypt+1]
  1125  //line parser.go.y:357
  1126  		{
  1127  			yyVAL.expr = &ast.ArithmeticOpExpr{Lhs: yyDollar[1].expr, Operator: "/", Rhs: yyDollar[3].expr}
  1128  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1129  		}
  1130  	case 62:
  1131  		yyDollar = yyS[yypt-3 : yypt+1]
  1132  //line parser.go.y:361
  1133  		{
  1134  			yyVAL.expr = &ast.ArithmeticOpExpr{Lhs: yyDollar[1].expr, Operator: "%", Rhs: yyDollar[3].expr}
  1135  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1136  		}
  1137  	case 63:
  1138  		yyDollar = yyS[yypt-3 : yypt+1]
  1139  //line parser.go.y:365
  1140  		{
  1141  			yyVAL.expr = &ast.ArithmeticOpExpr{Lhs: yyDollar[1].expr, Operator: "^", Rhs: yyDollar[3].expr}
  1142  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1143  		}
  1144  	case 64:
  1145  		yyDollar = yyS[yypt-2 : yypt+1]
  1146  //line parser.go.y:369
  1147  		{
  1148  			yyVAL.expr = &ast.UnaryMinusOpExpr{Expr: yyDollar[2].expr}
  1149  			yyVAL.expr.SetLine(yyDollar[2].expr.Line())
  1150  		}
  1151  	case 65:
  1152  		yyDollar = yyS[yypt-2 : yypt+1]
  1153  //line parser.go.y:373
  1154  		{
  1155  			yyVAL.expr = &ast.UnaryNotOpExpr{Expr: yyDollar[2].expr}
  1156  			yyVAL.expr.SetLine(yyDollar[2].expr.Line())
  1157  		}
  1158  	case 66:
  1159  		yyDollar = yyS[yypt-2 : yypt+1]
  1160  //line parser.go.y:377
  1161  		{
  1162  			yyVAL.expr = &ast.UnaryLenOpExpr{Expr: yyDollar[2].expr}
  1163  			yyVAL.expr.SetLine(yyDollar[2].expr.Line())
  1164  		}
  1165  	case 67:
  1166  		yyDollar = yyS[yypt-1 : yypt+1]
  1167  //line parser.go.y:383
  1168  		{
  1169  			yyVAL.expr = &ast.StringExpr{Value: yyDollar[1].token.Str}
  1170  			yyVAL.expr.SetLine(yyDollar[1].token.Pos.Line)
  1171  		}
  1172  	case 68:
  1173  		yyDollar = yyS[yypt-1 : yypt+1]
  1174  //line parser.go.y:389
  1175  		{
  1176  			yyVAL.expr = yyDollar[1].expr
  1177  		}
  1178  	case 69:
  1179  		yyDollar = yyS[yypt-1 : yypt+1]
  1180  //line parser.go.y:392
  1181  		{
  1182  			yyVAL.expr = yyDollar[1].expr
  1183  		}
  1184  	case 70:
  1185  		yyDollar = yyS[yypt-1 : yypt+1]
  1186  //line parser.go.y:395
  1187  		{
  1188  			yyVAL.expr = yyDollar[1].expr
  1189  		}
  1190  	case 71:
  1191  		yyDollar = yyS[yypt-3 : yypt+1]
  1192  //line parser.go.y:398
  1193  		{
  1194  			if ex, ok := yyDollar[2].expr.(*ast.Comma3Expr); ok {
  1195  				ex.AdjustRet = true
  1196  			}
  1197  			yyVAL.expr = yyDollar[2].expr
  1198  			yyVAL.expr.SetLine(yyDollar[1].token.Pos.Line)
  1199  		}
  1200  	case 72:
  1201  		yyDollar = yyS[yypt-3 : yypt+1]
  1202  //line parser.go.y:407
  1203  		{
  1204  			yyDollar[2].expr.(*ast.FuncCallExpr).AdjustRet = true
  1205  			yyVAL.expr = yyDollar[2].expr
  1206  		}
  1207  	case 73:
  1208  		yyDollar = yyS[yypt-2 : yypt+1]
  1209  //line parser.go.y:413
  1210  		{
  1211  			yyVAL.expr = &ast.FuncCallExpr{Func: yyDollar[1].expr, Args: yyDollar[2].exprlist}
  1212  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1213  		}
  1214  	case 74:
  1215  		yyDollar = yyS[yypt-4 : yypt+1]
  1216  //line parser.go.y:417
  1217  		{
  1218  			yyVAL.expr = &ast.FuncCallExpr{Method: yyDollar[3].token.Str, Receiver: yyDollar[1].expr, Args: yyDollar[4].exprlist}
  1219  			yyVAL.expr.SetLine(yyDollar[1].expr.Line())
  1220  		}
  1221  	case 75:
  1222  		yyDollar = yyS[yypt-2 : yypt+1]
  1223  //line parser.go.y:423
  1224  		{
  1225  			if yylex.(*Lexer).PNewLine {
  1226  				yylex.(*Lexer).TokenError(yyDollar[1].token, "ambiguous syntax (function call x new statement)")
  1227  			}
  1228  			yyVAL.exprlist = []ast.Expr{}
  1229  		}
  1230  	case 76:
  1231  		yyDollar = yyS[yypt-3 : yypt+1]
  1232  //line parser.go.y:429
  1233  		{
  1234  			if yylex.(*Lexer).PNewLine {
  1235  				yylex.(*Lexer).TokenError(yyDollar[1].token, "ambiguous syntax (function call x new statement)")
  1236  			}
  1237  			yyVAL.exprlist = yyDollar[2].exprlist
  1238  		}
  1239  	case 77:
  1240  		yyDollar = yyS[yypt-1 : yypt+1]
  1241  //line parser.go.y:435
  1242  		{
  1243  			yyVAL.exprlist = []ast.Expr{yyDollar[1].expr}
  1244  		}
  1245  	case 78:
  1246  		yyDollar = yyS[yypt-1 : yypt+1]
  1247  //line parser.go.y:438
  1248  		{
  1249  			yyVAL.exprlist = []ast.Expr{yyDollar[1].expr}
  1250  		}
  1251  	case 79:
  1252  		yyDollar = yyS[yypt-2 : yypt+1]
  1253  //line parser.go.y:443
  1254  		{
  1255  			yyVAL.expr = &ast.FunctionExpr{ParList: yyDollar[2].funcexpr.ParList, Stmts: yyDollar[2].funcexpr.Stmts}
  1256  			yyVAL.expr.SetLine(yyDollar[1].token.Pos.Line)
  1257  			yyVAL.expr.SetLastLine(yyDollar[2].funcexpr.LastLine())
  1258  		}
  1259  	case 80:
  1260  		yyDollar = yyS[yypt-5 : yypt+1]
  1261  //line parser.go.y:450
  1262  		{
  1263  			yyVAL.funcexpr = &ast.FunctionExpr{ParList: yyDollar[2].parlist, Stmts: yyDollar[4].stmts}
  1264  			yyVAL.funcexpr.SetLine(yyDollar[1].token.Pos.Line)
  1265  			yyVAL.funcexpr.SetLastLine(yyDollar[5].token.Pos.Line)
  1266  		}
  1267  	case 81:
  1268  		yyDollar = yyS[yypt-4 : yypt+1]
  1269  //line parser.go.y:455
  1270  		{
  1271  			yyVAL.funcexpr = &ast.FunctionExpr{ParList: &ast.ParList{HasVargs: false, Names: []string{}}, Stmts: yyDollar[3].stmts}
  1272  			yyVAL.funcexpr.SetLine(yyDollar[1].token.Pos.Line)
  1273  			yyVAL.funcexpr.SetLastLine(yyDollar[4].token.Pos.Line)
  1274  		}
  1275  	case 82:
  1276  		yyDollar = yyS[yypt-1 : yypt+1]
  1277  //line parser.go.y:462
  1278  		{
  1279  			yyVAL.parlist = &ast.ParList{HasVargs: true, Names: []string{}}
  1280  		}
  1281  	case 83:
  1282  		yyDollar = yyS[yypt-1 : yypt+1]
  1283  //line parser.go.y:465
  1284  		{
  1285  			yyVAL.parlist = &ast.ParList{HasVargs: false, Names: []string{}}
  1286  			yyVAL.parlist.Names = append(yyVAL.parlist.Names, yyDollar[1].namelist...)
  1287  		}
  1288  	case 84:
  1289  		yyDollar = yyS[yypt-3 : yypt+1]
  1290  //line parser.go.y:469
  1291  		{
  1292  			yyVAL.parlist = &ast.ParList{HasVargs: true, Names: []string{}}
  1293  			yyVAL.parlist.Names = append(yyVAL.parlist.Names, yyDollar[1].namelist...)
  1294  		}
  1295  	case 85:
  1296  		yyDollar = yyS[yypt-2 : yypt+1]
  1297  //line parser.go.y:476
  1298  		{
  1299  			yyVAL.expr = &ast.TableExpr{Fields: []*ast.Field{}}
  1300  			yyVAL.expr.SetLine(yyDollar[1].token.Pos.Line)
  1301  		}
  1302  	case 86:
  1303  		yyDollar = yyS[yypt-3 : yypt+1]
  1304  //line parser.go.y:480
  1305  		{
  1306  			yyVAL.expr = &ast.TableExpr{Fields: yyDollar[2].fieldlist}
  1307  			yyVAL.expr.SetLine(yyDollar[1].token.Pos.Line)
  1308  		}
  1309  	case 87:
  1310  		yyDollar = yyS[yypt-1 : yypt+1]
  1311  //line parser.go.y:487
  1312  		{
  1313  			yyVAL.fieldlist = []*ast.Field{yyDollar[1].field}
  1314  		}
  1315  	case 88:
  1316  		yyDollar = yyS[yypt-3 : yypt+1]
  1317  //line parser.go.y:490
  1318  		{
  1319  			yyVAL.fieldlist = append(yyDollar[1].fieldlist, yyDollar[3].field)
  1320  		}
  1321  	case 89:
  1322  		yyDollar = yyS[yypt-2 : yypt+1]
  1323  //line parser.go.y:493
  1324  		{
  1325  			yyVAL.fieldlist = yyDollar[1].fieldlist
  1326  		}
  1327  	case 90:
  1328  		yyDollar = yyS[yypt-3 : yypt+1]
  1329  //line parser.go.y:498
  1330  		{
  1331  			yyVAL.field = &ast.Field{Key: &ast.StringExpr{Value: yyDollar[1].token.Str}, Value: yyDollar[3].expr}
  1332  			yyVAL.field.Key.SetLine(yyDollar[1].token.Pos.Line)
  1333  		}
  1334  	case 91:
  1335  		yyDollar = yyS[yypt-5 : yypt+1]
  1336  //line parser.go.y:502
  1337  		{
  1338  			yyVAL.field = &ast.Field{Key: yyDollar[2].expr, Value: yyDollar[5].expr}
  1339  		}
  1340  	case 92:
  1341  		yyDollar = yyS[yypt-1 : yypt+1]
  1342  //line parser.go.y:505
  1343  		{
  1344  			yyVAL.field = &ast.Field{Value: yyDollar[1].expr}
  1345  		}
  1346  	case 93:
  1347  		yyDollar = yyS[yypt-1 : yypt+1]
  1348  //line parser.go.y:510
  1349  		{
  1350  			yyVAL.fieldsep = ","
  1351  		}
  1352  	case 94:
  1353  		yyDollar = yyS[yypt-1 : yypt+1]
  1354  //line parser.go.y:513
  1355  		{
  1356  			yyVAL.fieldsep = ";"
  1357  		}
  1358  	}
  1359  	goto yystack /* stack new state and value */
  1360  }