antlr 4 javascript -jsdoc启动和正则表达式内存冲突

lo8azlld  于 2023-03-11  发布在  Java
关注(0)|答案(1)|浏览(75)

我已经转换了标准的JavaScript Antlr 4语法器/词法分析器来支持JSDOC定义。
/** @var {sometype} id */词法分析器中的第一个规则是DocStart : '/**' -> pushMode(DOC_MODE);
然后DOC_MODE解析JSDOC内容,直到满足结束条件 */
我的问题是Antlr 4将其识别为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* ']'
    ;

谢谢!

jogvjijk

jogvjijk1#

最新的JS Lexer解决了这个问题,如下所示:

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

地点

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

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

相关问题