Конфликт комментариев в грамматике HQL - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь создать оператор --someinteger;, но моя проблема связана с правилом однострочного комментария HQL, которое гласит:L_S_COMMENT : ('--' | '//') .*? '\r'? '\n' -> channel(HIDDEN) ;И правила, которые я написал в лексере:T_SUB2 : '--' ;T_SEMICOLON : ';' ;Правило в парсере:dummy_rule: T_SUB2 'i' T_SEMICOLON ;Когда я проверяю правило, оно прекрасно работает с правильно отображенным деревом разбора, но когда я нажимаю клавишу ВВОД для новой строки, это показывает ошибку, и оно больше не принимает правила, я знаю, что это правило комментария , потому чтокогда я удаляю его, правила работают нормально, но удаление его не является оптимальным решением, если есть идеи, что может вызвать это и как это обойти.

1 Ответ

0 голосов
/ 20 декабря 2018

Если соответствующие операторы всегда должны заканчиваться в 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.

...