首页 > 解决方案 > 在扫描仪中递归地跳过嵌套注释

问题描述

我正在为编译器编写扫描仪,并且有一个功能可以在看到注释时跳过注释,我想知道如何以递归方式跳过嵌套注释,即“hello”w“world”之类的东西,到目前为止我有一些东西喜欢:

while ( current_char != '#' ){ // comments in this language starts with $# and end with #$)
      next_char(); // gets the next character in our file

}

标签: crecursioncompiler-constructionlexical-analysis

解决方案


使用深度计数器的嵌套评论

最简单的方法是维护“评论深度”的计数器:

  • 每次遇到$#,递增计数器;
  • 每次遇到#$,递减计数器。

当计数器为 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 的自动语法着色正确地将所有字符串着色为绿色。而没有 的前一个字符串没有\正确着色。


推荐阅读