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.