Ваш лексер действительно выглядит так:
UNH : 'UNH';
RDEL : '\n';
SDEL : ':';
FDEL : '+';
AN : 'a'..'z' | 'A'..'Z' | '0'..'9' | ' ';
Литерал 'UNH'
в вашем правиле file
становится правилом лексера, помещенным над всеми другими правилами лексера.
Когда лексер теперь натыкается на "UN"
, за которым следует что-то отличное от "H"
, он выдает ошибку, потому что лексеру некуда возвращаться. Если ваше правило AN
соответствует более чем одному символу, лексер может следовать этому правилу, но, поскольку оно соответствует только одному символу, лексер не будет возвращаться с "UN"
.
Как уже было предложено, dasblinkenlight является правильным: AN
должен соответствовать 1 или более символов, а optField
может соответствовать необязательному AN
. Однако другая часть его (или ее) ответа не совсем верна: отсюда мой ответ.