缩进词法分析

本文讨论了编程语言中使用缩进来区分代码块的优缺点,特别是聚焦于Python的缩进规则和词法分析。文章指出,缩进可以提升代码美观性,但也可能导致可读性问题和tab/space混用的混乱。在实现上,Python的词法分析器需要处理缩进的计算,如每行开头的前导空白。作者还比较了缩进与花括号作为代码块分隔符的差异,并介绍了Larva编译器在处理缩进时的方法。文章最后提到了缩进语法在某些场景下可能不适用,如嵌入式代码和匿名函数。
接下来会对larva实现的部分细节做一些分析,先看下编译器对于缩进词法的分析

用缩进来区分代码块或缩进参与词法、语法,python可能不是首创,不过大概是其中最有名的语言之一,相关的争议也一直不断,其实别说这个了,就连C语言中大括号是否应该另起一行都能争个几十年

正方认为,缩进可以让代码更美观,不过美观不美观也是一个主观看法,在这方面,反方提出,如果代码比较长,根据缩进区分代码块会造成可读性问题(虽然很多编辑器提供了缩进参考线),不过正方立即反驳,你干嘛把代码写那么长呢,超过50行的都单独写成函数不就行了?
另一个类似的争议点是,反方认为tab和空格难以区分,尤其是混用会造成各种阅读和调试上的混乱,有时候还会出现非常难以发现的bug,当然正方也会说,这是你们代码规范不够好,反方也会反驳说,一个语言对开发者要求过高了,本身就是一种缺陷

这个问题其实见仁见智,各有各的习惯,每个语言也有适合的场景,就编译器的实现来说,我也曾抛开习惯,考虑过两种方式的区别,其实区别主要还是在一些细节上,因为语法上都是命令式语言,只是词法格式不同罢了

从词法分析上看,引入缩进会增加难度,虽然实际也不是很难,但可能导致很难找到一个现成的词法工具如lex,python的词法分析就是自己写了个巨大的.c文件,在文档中也写了详细的和缩进相关的词法分析的过程

缩进的计算前面讲过,对于每个空格,算一个缩进,对于一个tab,则向前到下一个被8整除的位置,即当前缩进k=k+(8-k%8),换句话说就是tab算8个字符,这个在win的cmd、unix终端下大都是统一的,虽然一般的代码规范建议是4个空格。缩进的定义则是指每个逻辑行前面的前导空白

逻辑行是指语法上拥有完整逻辑意义的一行,如果代码没有折行,则每个物理行(即文本的每一行)就对应一个逻辑行,逻辑行和语句还是有点区别,比如:
if a:
这行不是语句,因为缺少if的代码段,但它是一个逻辑行

因此,对缩进的词法分析就可以这样:
1 解析缩进
2 解析一个物理行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值