parsing - 空格敏感语言如何处理换行符?
问题描述
我最近研究并构建了一个玩具 java 编译器,它在解析阶段之前丢弃了所有注释标记和空白标记。但是,我很好奇对空格敏感的语言(例如 Python 和 Swift)如何处理换行符。这些语言以语句的换行符结尾,因此不能简单地丢弃换行符。但是他们如何处理下面的情况呢?
foo(
bar
)
他们必须为此制作很多语法案例吗?比如foo ( bar )
,foo NEWLINE ( bar NEWLINE )
等等?
在我构建的 java 编译器中,这是通过消除换行符来处理的,它们都变成foo ( bar )
. 但是这在空格敏感的语言中是如何处理的呢?
解决方案
由于没有人回答,我又做了一轮谷歌搜索,找到了这个博客。根据它,Python 为括号维护一个堆栈,()[]
如果括号不完整,则忽略换行符。所以这可以实现:
foo(
bar
)
此外,对于空行或只有注释的行,也会跳过换行符。或者当换行符被转义时,不会生成换行符。这达到
# comment only
# only spaces
foo(\ # escaped
bar\
)
否则,标记器将生成一个 NEWLINE 标记。
该博客还向我指出了源代码tokenizer.c,我在第 1660 行找到了上述逻辑。
至于其他语言,我不确定,但我认为堆栈策略足够通用,可以被所有语言采用。
推荐阅读
- html - 所有元素仍然具有 menuBar 样式?( )
- u-sql - Azure 数据工厂:如何将 U-SQL 变量导出到管道中的下一个框?
- javascript - javascript : 使用 eventlistener 和 debounce 延迟加载图像
- c# - 如何检测 WPF 中的窗口内容变化?
- sql-server - SQL如何比较变量是否与数据库列中的值相同?
- apache-kafka-connect - VoltDB 的连接器接收器是否支持 Avro 消息?
- django - Django 身份验证问题
- javascript - 在 eslint 中配置公共文件路径
- node.js - 为什么猫鼬中用户对象的属性显示为未定义?
- javascript - 如何限制 FireBase firestore get() 方法返回的记录?