Если у вас нет веской причины поместить комментарий в парсер (который я хотел бы услышать), вы должны поместить его в лексер:
Comment
: '#' ~( '\r' | '\n' )*
;
И так как вы уже учитываетеразрывы строк в вашем правиле Space
, нет проблем с вводом, например # comment eof without <CR><LF>
Кроме того, если вы используете буквенные токены в правилах синтаксического анализатора, ANTLR автоматически создает их лексерные правила за кулисами.Так что в вашем случае:
comment
: '#' ~( '\r' | '\n' )*
;
будет соответствовать '#'
, за которым следует ноль или более токенов , отличных от '\r'
и '\n'
и не ноль или более символов, отличных от '\r'
и '\n'
.
Для дальнейшего использования:
Внутренние правила синтаксического анализатора
~
отменяет токены .
соответствует любому токену
Внутри правил лексера
~
отменяет символы .
совпаденийлюбой символ в диапазоне 0x0000
... 0xFFFF