编译器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
相关产品推荐
相关产品推荐

