antlr4 javascript - cla sh между jsdo c start и регулярным выражением liternal - PullRequest
0 голосов
/ 19 января 2020

Я преобразовал стандартный грамматик / лексер 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* ']'
    ;

Спасибо!

1 Ответ

0 голосов
/ 19 января 2020

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

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

Где

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

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

...