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

编译器scanner递归跳过嵌套注释的实现方法咨询

嵌套注释的实现逻辑

你当前的代码只能处理单层注释,遇到嵌套场景时,碰到内层注释的结束标记就会直接退出跳过逻辑,导致外层注释的后续内容被当成正常代码解析,完全不符合预期。

嵌套注释的核心处理逻辑是跟踪注释的嵌套深度:每碰到一个注释起始标记就将深度+1,每碰到一个注释结束标记就将深度-1,只有当深度归零的时候,才代表所有层级的注释都处理完成。

注意你的语言注释是双字符标记:起始为$#、结束为#$,不能只判断单个#字符,需要先预览下一个字符确认是完整的标记。

推荐实现:迭代版本(工业级编译器常用,无栈溢出风险)

// 前置条件:已经匹配到第一个注释起始标记$#,刚消费完#字符,此时初始深度为1
int comment_depth = 1;
while (comment_depth > 0 && !is_eof()) {
    char curr = next_char();
    if (curr == '$' && peek_next_char() == '#') {
        // 匹配到新的嵌套注释起始标记
        comment_depth++;
        next_char(); // 消费掉第二个字符#
    } else if (curr == '#' && peek_next_char() == '$') {
        // 匹配到一个注释结束标记
        comment_depth--;
        next_char(); // 消费掉第二个字符$
    }
    // 其余普通字符直接跳过即可
}

// 边界处理:到文件末尾时深度还大于0,说明有未闭合的注释
if (comment_depth > 0) {
    report_error("Unclosed nested comment");
}

其中peek_next_char()是scanner常用的辅助方法,作用是预览下一个字符但不移动扫描指针,不影响后续读取。

可选实现:递归版本

// 处理当前层的嵌套注释,返回当前层是否正常闭合
bool skip_nested_comment() {
    while (!is_eof()) {
        char curr = next_char();
        if (curr == '$' && peek_next_char() == '#') {
            next_char();
            // 递归处理内层嵌套注释
            skip_nested_comment();
        } else if (curr == '#' && peek_next_char() == '$') {
            next_char();
            // 当前层注释处理完成,返回上层
            return true;
        }
    }
    // 到文件末尾还没匹配到结束标记,报错
    report_error("Unclosed nested comment");
    return false;
}

// 初始调用:已经匹配到第一个$#,消费完#字符后调用即可
skip_nested_comment();

递归版本写法更直观,但如果注释嵌套层数过深,会有调用栈溢出的风险,不适合生产环境使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:30:00