antlr4 javascript - конфликт между началом jsdoc и литерналом регулярного выражения

Я преобразовал стандартный грамматик / лексер JavaScript Antlr4 для поддержки определений JSDOC. Теперь мне нужно иметь дело с однострочниками JSDOC, такими как

/** @var {sometype} id */Первое правило лексера:DocStart : '/**' -> pushMode(DOC_MODE);

и DOC_MODE затем анализирует материал JSDOC, пока не встретит закрывающий */

Моя проблема в том, что Antlr4 распознает это как RegularExpressionLiteral, определяемое как

RegularExpressionLiteral:       '/' RegularExpressionChar+ {IsRegexPossible()}? '/' IdentifierPart*;
fragment RegularExpressionChar
    : ~[\r\n\u2028\u2029\\/[]
    | RegularExpressionBackslashSequence
   | '[' RegularExpressionClassChar* ']'
    ;

Поскольку /** на самом деле не является законным регулярным выражением, я полагаю, мне нужно уточнить определение RE, чтобы не допускать два ** - либо в общем, либо явно после /**, я полагаю, я мог бы сделать это в IsRegexPossible() - но это новая почва для меня, и, конечно же, это произошло незадолго до крайнего срока... Кто-нибудь, пожалуйста, подтолкните меня в правильном направлении, желательно путем изменения Lexee/Grammer - или, если нет выбора, то в IsRegexPossible. Я попробовал это, добавив фрагмент RegularExpressionCharNoMultiplier (запретить '*' - но он по-прежнему распознает указанную выше строку как литерал регулярного выражения

RegularExpressionLiteral:       '/' ((RegularExpressionChar RegularExpressionCharNoMultiplier?)
                                   |  (RegularExpressionCharNoMultiplier RegularExpressionChar?))+
                                    {IsRegexPossible()}? '/' IdentifierPart*;
fragment RegularExpressionCharNoMultiplier
    : ~[*\r\n\u2028\u2029\\/[]
    | RegularExpressionBackslashSequence
   | '[' RegularExpressionClassChar* ']'
    ;

Спасибо!

1 ответ

Хорошо - последний JS Lexer решил это следующим образом:

RegularExpressionLiteral:       '/' RegularExpressionFirstChar RegularExpressionChar* {this.IsRegexPossible()}? '/' IdentifierPart*;

куда

fragment RegularExpressionFirstChar
    : ~[*\r\n\u2028\u2029\\/[]
    | RegularExpressionBackslashSequence
    | '[' RegularExpressionClassChar* ']'

На самом деле - не относясь к моей проблеме, я считаю, что "+" не может быть и в первом символе RE.

Другие вопросы по тегам