Если соответствующие операторы всегда должны заканчиваться в SEMI, то эффективно исключить их из определения комментария:
COMMENT
: ( CMark .*? Vws
| DMark .*? ~[; \t\r\n\f] Hws* Vws
) -> channel(HIDDEN)
;
fragment CMark : '//' ;
fragment DMark : '--' ;
fragment Hws : [ \t] ;
fragment Vws : [\r\n]+ ;
Пояснение
Первый альтернативный текстправила соответствует стандартному //
комментарию
Второй альт будет соответствовать --
комментарию, если один видимый символ непосредственно перед завершающим пробелом не является SEMI.~
- отрицание, а [; \t\r\n\f]
- набор символов.Поскольку нет оператора, модифицирующего набор, ~[; \t\r\n\f]
будет соответствовать только одному символу, который не является одним из именованных символов.
Следовательно, правило комментария не будет соответствовать терминальной части строки кода, котораясодержит --
и оканчивается на SEMI.