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

标签 python parsing whitespace

在解析像 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/

相关文章:

python - ANTLR4 PLSQL 语法 Python 3 缺失函数

.net - 如何从十六进制 RGB 字符串创建 System.Drawing.Color?

c++ - boost中的正则表达式提取信息

jQuery 将空格替换为 «-» 不适用于 <input type ="email"/>

mercurial - 在 mercurial 中进行 merge 时忽略空格

java - Spring StoredProcedure 结果集值修剪

python - 在范围创建中添加字符串

python - 依赖 setup.py 中的 git 仓库

python - python 为 RSA 模块使用什么类型的填充?

python - 使用关于文件名的正则表达式从目录中删除某些文件