//documentation comments
doc_comment :
'///' ( summary remarks?
|remarks
);
summary :
'<summary' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* tag_body+ (('\n' '///')* comment_text ('\n' '///')*)* '</summary>';
remarks :
'<remarks' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</remarks>';
tag_body : '<c' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</c>'
|'<code' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</code>'
|'<example' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</example>'
|'<exception' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</exception>'
|'<include' 'file' '=' '\'' comment_text '\'' 'path' '=' '\'' comment_text ('[' '@name' '=' '"'identifier '"' ']')? '\'' '/' '>'
|'<list' 'type' '=' ('"bullet"' | '"number"' | '"table"') '>' ('\n' '///')* listheader? listitem? '</list>'
|'<para' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</para>'
|'<param' 'name' '=' '"' identifier '"' '>' (('\n' '///')* comment_text ('\n' '///')*)* '</param>'
|'<paramref' 'name' '=' '"' comment_text '"' '/' '>'
|'<permission' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</permission>'
|'<returns' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</returns>'
|'<see' cref '/' '>'
|'<seealso' cref '/' '>'
|'<typeparam' 'name' '=' '"' comment_text '"' '>' (('\n' '///')* comment_text ('\n' '///')*)* '</typeparam>'
|'<typeparamref' 'name' '=' '"' comment_text '"' '/' '>'
|'<value' cref? '>' (('\n' '///')* comment_text ('\n' '///')*)* '</value>';
cref : 'cref' '=' '"' comment_text '"' ;
listheader : '<listheader>' ('<term>' (('\n' '///')* comment_text ('\n' '///')*)* '</term>')? ('<description>' (('\n' '///')* comment_text ('\n' '///')*)* '</description>')? '</listheader>';
listitem : '<listitem>' ('<term>' (('\n' '///')* comment_text ('\n' '///')*)* '</term>')? ('<description>' (('\n' '///')* comment_text ('\n' '///')*)* '</description>')? '</listitem>';
WS:
(' ' | '\r' | '\t' | '\n' ) -> skip;
comment_text : ANY_CHARS;
fragment ANY_CHARS: (.)*;
谢谢回复!
皮特
我确信理论上可以在解析文件其余部分的同时解析XML文档注释,但这是一个维护噩梦,特别是对于lexer规则。例如,你会如何处理以下问题?
/// <see
/// cref="Something"
/// />
您不应该采取这种方法,而应该执行以下操作。
>
将所有文档注释令牌移动到它们自己的通道。
@members {
public const int DocCommentsChannel = 2;
}
DOC_COMMENT : '///' ~[\r\n]* -> channel(DocCommentsChannel);
LINE_COMMENT : '//' ~[\r\n]* -> channel(HIDDEN);
可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?
我有一个antlr语法,它有多个与同一个单词匹配的词法规则。在词法分析过程中无法解决这个问题,但通过语法,它就变得毫不含糊了。 示例: 输入:<代码>1英寸(米) 单词“in”与lexer规则和匹配。 如何在保持语法文件可读性的同时解决此问题?
我有Antlr4中的语法,用来解析和验证定制语言。在其他方面,我的语法应该认为以下是“有效的” //将字符串值赋给变量 //带有字符串参数的函数 //带有特定格式(日期)的函数 下面是我语法中的相关部分
在ANTLR4中,我有一个lexer规则,说我可以使用任何字符得到任何单词,但空格和换行符除外。其定义如下: 我还有一个lexer规则(定义在than WORD之前),用于进入EVAL模式: 我考虑的另一个选择是将“word”定义为${and}包围的文本以外的任何东西。但我不知道如何创建这样的lexer规则。 我该怎么解决?要区分评价和词?
我对是否允许以下情况感到困惑: UPDATE:我知道当我在for循环中提供正确的声明类型时,它就会工作。问题是如果我不这样做会发生什么?
我可以在parser中而不是在lexer中定义范围吗?