Правило лексера комментариев

Я новичок в ANTLR, и я придумал это правило лексера для разбора комментариев, будет ли оно работать?

COMMENT_LINE        :   (COMMENT (. - LINE_ENDING)* LINE_ENDING){$channel=hidden};

(Я не мог найти ничего о синтаксисе, подобном этому, в документах)


person RCIX    schedule 09.12.2009    source источник
comment
Помимо того факта, что это зависит от всех других правил лексера в вашей грамматике, знак минус, -, вероятно, вызовет какую-то ошибку. Можешь объяснить, что ты имеешь в виду? И можете ли вы привести пару примеров строк, которые вы пытаетесь разобрать?   -  person Bart Kiers    schedule 09.12.2009
comment
Все остальные упомянутые правила на самом деле являются токенами, я пытаюсь сопоставить ключевое слово комментария, за которым следует остальная часть строки.   -  person RCIX    schedule 09.12.2009
comment
Порядок правил лексера также важен. Например, если правило лексера ANY_CHAR : . ; не является последним правилом, грамматика не будет работать, так как любое правило после этого никогда не сможет ничего сопоставить, поскольку ANY_CHAR все сожрет. Но я думаю, Боян успешно ответил на ваш вопрос, верно?   -  person Bart Kiers    schedule 09.12.2009
comment
Мое предыдущее замечание Помимо того факта, что оно зависит от всех других правил лексера в вашей грамматике,... немного вводит в заблуждение (или даже неверно!). Я имел в виду: Помимо того факта, что это может зависеть от некоторых других правил лексера в вашей грамматике,.   -  person Bart Kiers    schedule 09.12.2009


Ответы (1)


Ваше правило вообще не компилируется. Если вы используете ANTLRWorks для создания новой грамматики лексера, вы можете установить флажок, чтобы он сгенерировал правило лексера, соответствующее однострочным комментариям. Он генерирует это:

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    ;

В качестве альтернативы вы можете использовать что-то вроде этого для соответствия однострочным комментариям:

COMMENT_LINE 
    : COMMENT (options{greedy=false;}: .)* LINE_ENDING {$channel=HIDDEN;}
    ;
person Bojan Resnik    schedule 09.12.2009
comment
Прохладный. по какой причине ANTLRWorks заявляет, что не может отобразить правило COMMENT_LINE, потому что начальное состояние не найдено? - person RCIX; 09.12.2009