Я преобразовал стандартный грамматик / лексер JavaScript Antlr4 для поддержки определений JSDO C. Теперь мне нужно разобраться с JSDO C однострочниками, такими как
/** @var {sometype} id */
Первое правило в лексере: DocStart : '/**' -> pushMode(DOC_MODE);
, а затем DOC_MODE анализирует материал JSDO C пока он не встретит закрывающий * /
Моя проблема в том, что Antlr4 распознает это как RegularExpressionLiteral, определенный как
RegularExpressionLiteral: '/' RegularExpressionChar+ {IsRegexPossible()}? '/' IdentifierPart*;
fragment RegularExpressionChar
: ~[\r\n\u2028\u2029\\/[]
| RegularExpressionBackslashSequence
| '[' RegularExpressionClassChar* ']'
;
Поскольку / ** на самом деле не является законным регулярным выражением, я полагаю, мне нужно чтобы изобразить определение RE, чтобы не допустить двух ** - вообще или явно после / **, я полагаю, я мог бы сделать это в IsRegexPossible () - но для меня это новое основание и, конечно, это произошло незадолго до крайнего срока .... Может кто-нибудь дать мне pu sh в правильном направлении, желательно с помощью изменения в Lexee / Grammer - или, если нет выбора, то в IsRegexPossible. Я попробовал это, добавив фрагмент RegularExpressionCharNoMultiplier (disallow '*' - но он все равно распознает вышеуказанную строку как литерал регулярного выражения
RegularExpressionLiteral: '/' ((RegularExpressionChar RegularExpressionCharNoMultiplier?)
| (RegularExpressionCharNoMultiplier RegularExpressionChar?))+
{IsRegexPossible()}? '/' IdentifierPart*;
fragment RegularExpressionCharNoMultiplier
: ~[*\r\n\u2028\u2029\\/[]
| RegularExpressionBackslashSequence
| '[' RegularExpressionClassChar* ']'
;
Спасибо!