如何在空格敏感语言中处理换行符?

How is newline handled in whitespace sensitive languages?

我最近研究并构建了一个玩具 java 编译器,它在解析阶段之前丢弃所有注释标记和空白标记。但是,我很好奇 Python 和 Swift 等空格敏感语言如何处理换行符。这些语言以语句的换行符结尾,因此不能简单地丢弃换行符。但他们如何处理下面的情况?

foo(
    bar
) 

他们必须为此做很多语法格吗?比如foo ( bar )foo NEWLINE ( bar NEWLINE )等?

在我构建的 java 编译器中,这是通过消除换行符来处理的,它们都变成了 foo ( bar )。但是这在对空白敏感的语言中是如何处理的?

由于没有人回答,我又进行了一轮谷歌搜索并找到了 this blog。根据它,Python 为括号 ()[] 维护一个堆栈,如果有不完整的括号,换行符将被忽略。这样就可以实现:

foo(
    bar
)

此外,对于空行或只有注释的行,换行符也会被跳过。或者当换行符被转义时,不会生成换行符。这样就实现了

# comment only
             # only spaces
foo(\        # escaped
    bar\
)            

否则,标记器将生成一个 NEWLINE 标记。

该博客还向我指出了源代码 tokenizer.c, where I find the above logic at line 1660

至于其他语言,我不太确定,但我认为堆栈策略足够通用,可以被所有语言采用。