我已经转换了标准的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* ']'
;
谢谢!
1条答案
按热度按时间jogvjijk1#
最新的JS Lexer解决了这个问题,如下所示:
地点
实际上-与我的问题无关,我认为“+”也不能在第一个RE字符中