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