我试图在我的 JavaScript 文件中解析一个特定的(自制的)JavaDoc 标记,我正在努力理解如何实现这一点。 Antlr 正在提示,如下所述:
jsDocComment
: '/**' (importJsDocCommand | ~('*/'))* '*/' <== See note 1
;
importJsDocCommand
: '@import' gav
;
gav
: gavGroup ':' gavArtifact
-> ^(IMPORT gavGroup gavArtifact)
;
gavGroup
: gavIdentifier
;
gavArtifact
: gavIdentifier
;
gavIdentifier
: ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'|'-'|'.')* <== See note 2
;
注意1:永远无法匹配以下备选方案:1
注意 2:决策可以使用多个备选方案匹配诸如“'_'..'.'”之类的输入:1、2 因此,该输入的备选方案 2 被禁用
这是我要解析的内容:
/** a */
/** @something */
/** @import com.jquery:jquery */
所有行都应该解析正常,只有在名为“IMPORT”的 AST 树元素下创建的 @import 语句(连同它的 Maven group:artifact 值)。
感谢您的协助。
最佳答案
Christopher Hunt wrote:
- Note 1: The following alternatives can never be matched: 1
~('*/')
不正确:您只能否定词法分析器规则中的单个字符 (!)。在您的代码段中,您试图否定解析器规则中的某些内容。在解析器规则中,您不是在否定字符,而是在否定标记。例如:
parse : ~A;
foo : .;
A : 'A';
B : 'B';
C : 'C';
parse
规则将不匹配除'A'
之外的任何字符,但匹配'B'
或 'C'
。并且 foo
不匹配任何字符,但匹配任何标记(或词法分析器规则)。
Christopher Hunt wrote:
- Note 2: Decision can match input such as "'_'..'.'" using multiple alternatives: 1, 2 As a result, alternative(s) 2 were disabled for that input
两个问题:
- 您发布了整个语法吗?
- 您是要解析整个 JS 文件还是只是“过滤”JS 文件并提取 JavaDoc 注释?
如果是后者,使用 ANTLR 有更简单的方法(如果是这种情况,可以给出解释)。
编辑
最简单的方法是添加一个新的 DocComment
规则词法分析器并将其放在(现有的)Comment
规则之上:
DocComment
: '/**' (options {greedy=false;} : .)* '*/'
;
Comment
: '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;}
;
关于javascript - 使用 ANTLR 解析 JavaDoc 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3836096/