Но в соответствии с этим ответом ANTLR старается, чтобы самый длинный матч выиграл у более коротких.
Это так, и это должно быть тем, что вы хотите. Обратите внимание, что это правило (так называемое правило максимального мунка) не имеет ничего общего с тем, сопоставляется ли append
как ключевое слово или идентификатор. Это связано с тем, что appendix
соответствует ключевому слову append
, за которым следует идентификатор ix
; или как единственный идентификатор appendix
. Поскольку последнее, очевидно, является тем, что нужно в большинстве контекстов, полезно правило максимального жаворонка.
В данном случае важно то, что происходит, если несколько правил дают совпадение одинаковой длины. В этом случае ANTLR применяет правила, которые определены первыми в грамматике. Поэтому, если вы измените порядок своих определений так, чтобы Keyword
предшествовал Identifier
, правило Keyword
будет иметь приоритет в тех случаях, когда оба правила приведут к совпадению одинаковой длины (и самое длинное совпадение все равно выиграет в случаи, когда это не так). Таким образом, ввод, такой как append appendix
, будет маркирован как ключевое слово append
, за которым следует идентификатор appendix
, который должен быть тем, что вы хотите.
PS: я не уверен, где и как ваш лексер будет использоваться, но обычно вы хотите различать guish между разными ключевыми словами вместо одного правила, которое соответствует всем ключевым словам. Если токены будут использоваться в качестве входных данных для синтаксического анализатора, информация о том, что что-то является ключевым словом, не очень полезна, не зная, какое это ключевое слово.