antlr4 javascript-jsdoc开始与正则表达式liternal之间发生冲突

问题描述 投票:0回答:1

我已经转换了标准的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* ']'
    ;

谢谢!

javascript regex jsdoc antrl4
1个回答
0
投票

确定-最新的JS Lexer对其进行了如下解决:

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

哪里

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

实际上-与我的问题无关,我相信“ +”也不能出现在第一个RE字符中

© www.soinside.com 2019 - 2024. All rights reserved.