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
}