首页 > 解决方案 > 空格敏感语言如何处理换行符?

问题描述

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

foo(
    bar
) 

他们必须为此制作很多语法案例吗?比如foo ( bar )foo NEWLINE ( bar NEWLINE )等等?

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

标签: parsingcompiler-construction

解决方案


由于没有人回答,我又做了一轮谷歌搜索,找到了这个博客。根据它,Python 为括号维护一个堆栈,()[]如果括号不完整,则忽略换行符。所以这可以实现:

foo(
    bar
)

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

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

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

该博客还向我指出了源代码tokenizer.c,我在第 1660 行找到了上述逻辑。

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


推荐阅读