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