c - 在扫描仪中递归地跳过嵌套注释
问题描述
我正在为编译器编写扫描仪,并且有一个功能可以在看到注释时跳过注释,我想知道如何以递归方式跳过嵌套注释,即“hello”w“world”之类的东西,到目前为止我有一些东西喜欢:
while ( current_char != '#' ){ // comments in this language starts with $# and end with #$)
next_char(); // gets the next character in our file
}
解决方案
使用深度计数器的嵌套评论
最简单的方法是维护“评论深度”的计数器:
- 每次遇到
$#
,递增计数器; - 每次遇到
#$
,递减计数器。
当计数器为 0 时,您正在阅读代码;当计数器为 1 或更多时,您正在阅读评论。
在阅读评论时,忽略除$#
and之外的所有内容#$
。
例子:
Code $# comment depth 1 $# comment depth 2 #$
comment depth 1 #$ code $# comment depth 1 #$ code
转义字符串中的字符
您提到了以下示例:
" hello "w" world"
让我强调以下建议:
如果开始注释和结束注释符号相同,则不允许嵌套注释。
否则,将无法区分以下两种情况:
Situation 1: "comment" code "comment"
Situation 2: "comment "nested comment" comment"
请注意,该符号"
通常用于字符串,而不是注释。没有“嵌套字符串”之类的东西(这意味着什么??)。但是,有“字符串中的转义字符”之类的东西。事实上,如果你想要一个包含字符的字符串"
怎么办?通常的做法是保留一个转义字符;直接跟在转义字符之后的字符不会被解释。因此,您可以编写以下字符串:
" hello \"w\" world"
令人满意的是,您可以注意到 StackOverflow 的自动语法着色正确地将所有字符串着色为绿色。而没有 的前一个字符串没有\
正确着色。
推荐阅读
- python - 如何根据字符串的某些位置存在特定字符来删除等长字符串列表的成员?
- jenkins - 使用声明式管道在不同的存储库上并行运行相同的 Jenkins 作业
- ios - 写入领域(成功),继续到 NextVC(成功)并显示保存到领域的先前 VC 的字符串数据(需要帮助)
- c# - 何时在 EF Core 中使用异步方法?
- php - 如何防止一个模型在 OneToOne 关系中有多个模型?[拉拉维尔]
- apache-kafka - 用于 API 生成消息、创建消费者组、订阅消费者组和读取记录的 Kafka 命令
- json - JQ 键映射名称为大写并删除空格
- java - TreeSet 中的 Java 私有整数
- flutter - 如何重置 ListView.Builder 索引
- css - 为什么我不能正确旋转 Safari 和 iPhone 中的重叠元素?