我已经转换了标准的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* ']'
;
谢谢!
确定-最新的JS Lexer对其进行了如下解决:
RegularExpressionLiteral: '/' RegularExpressionFirstChar RegularExpressionChar* {this.IsRegexPossible()}? '/' IdentifierPart*;
哪里
fragment RegularExpressionFirstChar
: ~[*\r\n\u2028\u2029\\/[]
| RegularExpressionBackslashSequence
| '[' RegularExpressionClassChar* ']'
实际上-与我的问题无关,我相信“ +”也不能出现在第一个RE字符中