You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ANTLR监听代码中提取COMMENT_TEXT的纯文本内容?

我之前也碰到过类似的问题,其实核心就是要跳过外层的注释包裹符号,直接取内部的COMMENT_TEXT节点内容就行,给你具体的修改思路和代码:

解决思路

你的comment规则包含两种类型:COMMENT(括号包裹)和SLASH_COMMENT(//包裹),这两个规则里都嵌套了COMMENT_TEXT。ANTLR生成的解析器上下文类会为每个子规则/词法符号生成对应的访问方法,所以我们可以直接定位到内部的COMMENT_TEXT节点,而不是拿整个注释的文本。

修改后的监听代码

public override void ExitComment(P.CommentContext context)
{
    var cb = new CommentBlock();
    
    // 判断当前注释类型,提取对应的COMMENT_TEXT内容
    if (context.COMMENT() != null)
    {
        // 获取括号注释里的COMMENT_TEXT子节点
        var commentTextNode = context.COMMENT().COMMENT_TEXT();
        cb.OriginalText = commentTextNode?.GetText() ?? string.Empty;
    }
    else if (context.SLASH_COMMENT() != null)
    {
        // 获取双斜杠注释里的COMMENT_TEXT子节点
        var commentTextNode = context.SLASH_COMMENT().COMMENT_TEXT();
        cb.OriginalText = commentTextNode?.GetText() ?? string.Empty;
    }
    
    _currentBlock = cb;
}

额外说明

  • 用context.COMMENT()和context.SLASH_COMMENT()可以判断当前匹配的是哪种注释规则
  • 调用对应的COMMENT_TEXT()方法就能拿到内部的文本节点,再用GetText()就不会包含外层的括号或//了
  • 加上?? string.Empty是为了处理空注释的情况(比如()或者////),避免空引用异常

内容的提问来源于stack exchange,提问作者Ivan Bukashkin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:57:03