首页 > 解决方案 > antlr4 javascript - jsdoc 启动和正则表达式 liternal 之间的冲突

问题描述

我已将标准 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 - 或者如果别无选择,那么在是正则表达式可能。我通过添加片段 RegularExpressionCharNoMultiplier (disallow '*' - 但它仍然将上面的字符串识别为正则表达式文字

RegularExpressionLiteral:       '/' ((RegularExpressionChar RegularExpressionCharNoMultiplier?)
                                   |  (RegularExpressionCharNoMultiplier RegularExpressionChar?))+
                                    {IsRegexPossible()}? '/' IdentifierPart*;
fragment RegularExpressionCharNoMultiplier
    : ~[*\r\n\u2028\u2029\\/[]
    | RegularExpressionBackslashSequence
   | '[' RegularExpressionClassChar* ']'
    ;

谢谢 !

标签: javascriptregexjsdocantrl4

解决方案


好的 - 最新的 JS Lexer 解决了它如下:

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

在哪里

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

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


推荐阅读