如何在空格敏感语言中处理换行符?
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。
至于其他语言,我不太确定,但我认为堆栈策略足够通用,可以被所有语言采用。
我最近研究并构建了一个玩具 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。
至于其他语言,我不太确定,但我认为堆栈策略足够通用,可以被所有语言采用。