gpt4 book ai didi

python - Python 解析器如何处理缩进?

转载 作者:IT老高 更新时间:2023-10-28 20:34:31 25 4
gpt4 key购买 nike

在解析像 C 这样的自由格式语言时,解析器很容易通过查看解析器发出的符号来确定多个表达式何时相互关联。比如在代码中

if (x == 5) {
a = b;
c = d;
}

解析器可以判断出 a = b;c = d; 是同一 block 语句的一部分,因为它们被大括号包围。这可以很容易地被编码为一个 CFG 使用这样的东西:

STMT        ::=  IF_STMT | EXPR; | BLOCK_STMT | STMT STMT
IF_STMT ::= if ( EXPR ) STMT
BLOCK_STMT ::= { STMT }

但是,在 Python 和其他对空格敏感的语言中,这样做并不容易,因为语句的结构只能从它们的绝对位置推断出来,我认为这不能轻易地编码成 CFG。例如,上面的 Python 代码如下所示:

if x == 5:
a = b
c = d

尽我所能,我看不出有一种方法可以编写可以接受这一点的 CFG,因为我不知道如何将“同一嵌套级别的两个语句”编码到 CFG 中。

Python 解析器如何将语句分组?他们是否依赖于自动插入表示语句开始和结束的额外标记的扫描仪?他们是否为程序生成了一个粗略的 AST,然后有一个额外的 channel 来根据它们的缩进组装语句?对于我缺少的这个问题,是否有一个聪明的 CFG?或者他们是否使用了比标准 LL(1) 或 LALR(1) 解析器更强大的解析器,能够将空格级别考虑在内?

最佳答案

缩进由两个“伪标记”处理 - INDENT 和 DEDENT。有一些细节here .有关更多信息,您应该查看 python 标记器和解析器的源代码。

关于python - Python 解析器如何处理缩进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6430297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com