func hyperkvErrorMessage()

in parser.go [176:238]


func hyperkvErrorMessage(state, lookAhead int) string {
	const TOKSTART = 4

	if !hyperkvErrorVerbose {
		return "syntax error"
	}

	for _, e := range hyperkvErrorMessages {
		if e.state == state && e.token == lookAhead {
			return "syntax error: " + e.msg
		}
	}

	res := "syntax error: unexpected " + hyperkvTokname(lookAhead)

	// To match Bison, suggest at most four expected tokens.
	expected := make([]int, 0, 4)

	// Look for shiftable tokens.
	base := int(hyperkvPact[state])
	for tok := TOKSTART; tok-1 < len(hyperkvToknames); tok++ {
		if n := base + tok; n >= 0 && n < hyperkvLast && int(hyperkvChk[int(hyperkvAct[n])]) == tok {
			if len(expected) == cap(expected) {
				return res
			}
			expected = append(expected, tok)
		}
	}

	if hyperkvDef[state] == -2 {
		i := 0
		for hyperkvExca[i] != -1 || int(hyperkvExca[i+1]) != state {
			i += 2
		}

		// Look for tokens that we accept or reduce.
		for i += 2; hyperkvExca[i] >= 0; i += 2 {
			tok := int(hyperkvExca[i])
			if tok < TOKSTART || hyperkvExca[i+1] == 0 {
				continue
			}
			if len(expected) == cap(expected) {
				return res
			}
			expected = append(expected, tok)
		}

		// If the default action is to accept or reduce, give up.
		if hyperkvExca[i+1] != 0 {
			return res
		}
	}

	for i, tok := range expected {
		if i == 0 {
			res += ", expecting "
		} else {
			res += " or "
		}
		res += hyperkvTokname(tok)
	}
	return res
}