func()

in parser.go [279:475]


func (hyperkvrcvr *hyperkvParserImpl) Parse(hyperkvlex hyperkvLexer) int {
	var hyperkvn int
	var hyperkvVAL hyperkvSymType
	var hyperkvDollar []hyperkvSymType
	_ = hyperkvDollar // silence set and not used
	hyperkvS := hyperkvrcvr.stack[:]

	Nerrs := 0   /* number of errors */
	Errflag := 0 /* error recovery flag */
	hyperkvstate := 0
	hyperkvrcvr.char = -1
	hyperkvtoken := -1 // hyperkvrcvr.char translated into internal numbering
	defer func() {
		// Make sure we report no lookahead when not parsing.
		hyperkvstate = -1
		hyperkvrcvr.char = -1
		hyperkvtoken = -1
	}()
	hyperkvp := -1
	goto hyperkvstack

ret0:
	return 0

ret1:
	return 1

hyperkvstack:
	/* put a state and value onto the stack */
	if hyperkvDebug >= 4 {
		__yyfmt__.Printf("char %v in %v\n", hyperkvTokname(hyperkvtoken), hyperkvStatname(hyperkvstate))
	}

	hyperkvp++
	if hyperkvp >= len(hyperkvS) {
		nyys := make([]hyperkvSymType, len(hyperkvS)*2)
		copy(nyys, hyperkvS)
		hyperkvS = nyys
	}
	hyperkvS[hyperkvp] = hyperkvVAL
	hyperkvS[hyperkvp].yys = hyperkvstate

hyperkvnewstate:
	hyperkvn = int(hyperkvPact[hyperkvstate])
	if hyperkvn <= hyperkvFlag {
		goto hyperkvdefault /* simple state */
	}
	if hyperkvrcvr.char < 0 {
		hyperkvrcvr.char, hyperkvtoken = hyperkvlex1(hyperkvlex, &hyperkvrcvr.lval)
	}
	hyperkvn += hyperkvtoken
	if hyperkvn < 0 || hyperkvn >= hyperkvLast {
		goto hyperkvdefault
	}
	hyperkvn = int(hyperkvAct[hyperkvn])
	if int(hyperkvChk[hyperkvn]) == hyperkvtoken { /* valid shift */
		hyperkvrcvr.char = -1
		hyperkvtoken = -1
		hyperkvVAL = hyperkvrcvr.lval
		hyperkvstate = hyperkvn
		if Errflag > 0 {
			Errflag--
		}
		goto hyperkvstack
	}

hyperkvdefault:
	/* default state action */
	hyperkvn = int(hyperkvDef[hyperkvstate])
	if hyperkvn == -2 {
		if hyperkvrcvr.char < 0 {
			hyperkvrcvr.char, hyperkvtoken = hyperkvlex1(hyperkvlex, &hyperkvrcvr.lval)
		}

		/* look through exception table */
		xi := 0
		for {
			if hyperkvExca[xi+0] == -1 && int(hyperkvExca[xi+1]) == hyperkvstate {
				break
			}
			xi += 2
		}
		for xi += 2; ; xi += 2 {
			hyperkvn = int(hyperkvExca[xi+0])
			if hyperkvn < 0 || hyperkvn == hyperkvtoken {
				break
			}
		}
		hyperkvn = int(hyperkvExca[xi+1])
		if hyperkvn < 0 {
			goto ret0
		}
	}
	if hyperkvn == 0 {
		/* error ... attempt to resume parsing */
		switch Errflag {
		case 0: /* brand new error */
			hyperkvlex.Error(hyperkvErrorMessage(hyperkvstate, hyperkvtoken))
			Nerrs++
			if hyperkvDebug >= 1 {
				__yyfmt__.Printf("%s", hyperkvStatname(hyperkvstate))
				__yyfmt__.Printf(" saw %s\n", hyperkvTokname(hyperkvtoken))
			}
			fallthrough

		case 1, 2: /* incompletely recovered error ... try again */
			Errflag = 3

			/* find a state where "error" is a legal shift action */
			for hyperkvp >= 0 {
				hyperkvn = int(hyperkvPact[hyperkvS[hyperkvp].yys]) + hyperkvErrCode
				if hyperkvn >= 0 && hyperkvn < hyperkvLast {
					hyperkvstate = int(hyperkvAct[hyperkvn]) /* simulate a shift of "error" */
					if int(hyperkvChk[hyperkvstate]) == hyperkvErrCode {
						goto hyperkvstack
					}
				}

				/* the current p has no shift on "error", pop stack */
				if hyperkvDebug >= 2 {
					__yyfmt__.Printf("error recovery pops state %d\n", hyperkvS[hyperkvp].yys)
				}
				hyperkvp--
			}
			/* there is no state on the stack with an error shift ... abort */
			goto ret1

		case 3: /* no shift yet; clobber input char */
			if hyperkvDebug >= 2 {
				__yyfmt__.Printf("error recovery discards %s\n", hyperkvTokname(hyperkvtoken))
			}
			if hyperkvtoken == hyperkvEofCode {
				goto ret1
			}
			hyperkvrcvr.char = -1
			hyperkvtoken = -1
			goto hyperkvnewstate /* try again in the same state */
		}
	}

	/* reduction by production hyperkvn */
	if hyperkvDebug >= 2 {
		__yyfmt__.Printf("reduce %v in:\n\t%v\n", hyperkvn, hyperkvStatname(hyperkvstate))
	}

	hyperkvnt := hyperkvn
	hyperkvpt := hyperkvp
	_ = hyperkvpt // guard against "declared and not used"

	hyperkvp -= int(hyperkvR2[hyperkvn])
	// hyperkvp is now the index of $0. Perform the default action. Iff the
	// reduced production is ε, $1 is possibly out of range.
	if hyperkvp+1 >= len(hyperkvS) {
		nyys := make([]hyperkvSymType, len(hyperkvS)*2)
		copy(nyys, hyperkvS)
		hyperkvS = nyys
	}
	hyperkvVAL = hyperkvS[hyperkvp+1]

	/* consult goto table to find next state */
	hyperkvn = int(hyperkvR1[hyperkvn])
	hyperkvg := int(hyperkvPgo[hyperkvn])
	hyperkvj := hyperkvg + hyperkvS[hyperkvp].yys + 1

	if hyperkvj >= hyperkvLast {
		hyperkvstate = int(hyperkvAct[hyperkvg])
	} else {
		hyperkvstate = int(hyperkvAct[hyperkvj])
		if int(hyperkvChk[hyperkvstate]) != -hyperkvn {
			hyperkvstate = int(hyperkvAct[hyperkvg])
		}
	}
	// dummy call; replaced with literal code
	switch hyperkvnt {

	case 1:
		hyperkvDollar = hyperkvS[hyperkvpt-1 : hyperkvpt+1]
//line kvp.y:70
		{
			hyperkvVAL.entries = make([]*HyperkvItem, 0)
		}
	case 2:
		hyperkvDollar = hyperkvS[hyperkvpt-2 : hyperkvpt+1]
//line kvp.y:74
		{
			hyperkvVAL.entries = append(hyperkvDollar[2].entries, hyperkvDollar[1].entry)
			hyperkvlex.(*hyperkvLexerImpl).Result = hyperkvVAL.entries
		}
	case 3:
		hyperkvDollar = hyperkvS[hyperkvpt-4 : hyperkvpt+1]
//line kvp.y:81
		{
			hyperkvVAL.entry = &HyperkvItem{Key: hyperkvDollar[1].content, Value: hyperkvDollar[3].content}
		}
	}
	goto hyperkvstack /* stack new state and value */
}