javascript - 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* ']'
;
谢谢 !
解决方案
好的 - 最新的 JS Lexer 解决了它如下:
RegularExpressionLiteral: '/' RegularExpressionFirstChar RegularExpressionChar* {this.IsRegexPossible()}? '/' IdentifierPart*;
在哪里
fragment RegularExpressionFirstChar
: ~[*\r\n\u2028\u2029\\/[]
| RegularExpressionBackslashSequence
| '[' RegularExpressionClassChar* ']'
实际上-与我的问题无关,我相信“+”也不能在第一个 RE 字符中
推荐阅读
- python - 为许多类似的 excel 文件自动执行此代码并输出到一个文件
- java - 在Java中将数据添加到scala WrappedArray
- vim - 是否可以从 vim 帮助提示中修复 'help-curwin' 命令/功能?
- typescript - 使用道具更改 Typescript 中的状态
- sharepoint-online - SPFx 应用定制器中的 CSS 效果延迟
- c# - Xamarin.Android 中未找到属性 Layout_ConstraintTop_to TopOf 问题
- python - 在 python 中使用 multiprocessing.Pool 时无法显示进度(使用 tqdm)
- javascript - 如何从电子托盘图标打开一个新窗口
- c - 净::ERR_INCOMPLETE_CHUNKED_ENCODING 200(好的)
- python-3.x - Django 在管理列表中添加一个带有 ID url 链接的自定义链接