什么东西负责显式的线路连接?

问题描述 投票:0回答:1

Python 分词器似乎不负责显式行连接。我的意思是,如果我们在文件中写入以下代码

script.py

"one \
two"

然后在命令提示符下输入

python -m tokenize script.py
,我们会得到下表:

0,0-0,0:            ENCODING       'utf-8'
1,0-2,4:            STRING         '"one \\\ntwo"'
2,4-2,5:            NEWLINE        '\n'
3,0-3,0:            ENDMARKER      ''

这意味着第二个标记包含字符串

'"one \\\ntwo"'
。但我希望它是字符串
'"one two"'
。那么,什么东西实际上处理 Python 中的显式行连接呢?也许 Python 解析器可以做到这一点?
或者也许在标记化和解析阶段之间存在一些单独的“评估阶段”,其中每个标记字符串都被转换为更方便的解析表示(此阶段负责显式行连接)?

维基百科有一些关于一般编程上下文中的评估阶段的文字(即它没有具体谈论Python),但这个描述对我来说不是很清楚,我无法想出更多的例子(除了字符串文字中的显式行连接之外),当 Python 中需要进行此类潜在评估时。这种评估阶段的存在意味着解析器不会直接从标记器获取输入......


编辑。我还测试了 Python 分词器如何处理字符串文字外部的显式行连接。我进去了

2 + \
3

并获得以下代币:

0,0-0,0:            ENCODING       'utf-8'
1,0-1,1:            NUMBER         '2'
1,2-1,3:            OP             '+'
2,0-2,1:            NUMBER         '3'
2,1-2,2:            NEWLINE        '\n'
3,0-3,0:            ENDMARKER      ''

在这种情况下,分词器只是删除了

\
符号,正如我所料。

python language-lawyer tokenize
1个回答
0
投票

您的观察是准确的:Python 中显式行连接的处理是微妙的,并且涉及语言处理的多个阶段。

Tokenizer:处理行连续字符(

\
)的初始识别,但不会在字符串文字中解析它们,导致标记仍然包含转义序列。

解析器: 解析字符串文字中的行延续,将

\\n
解释为实际的换行符,并在 STRING 标记的上下文中适当地连接行。

运行时:执行解析的代码,根据需要解释和评估字符串文字。

举个例子:

"one \
two"

代币化:

STRING: '"one \\\ntwo"'

解析:

解析器处理 STRING 标记,解析行延续,并有效地将其视为:

"one two"

评价:

执行时,按原样使用字符串文字“一二”。

另请注意,在没有字符串文字的情况下,通常,分词器步骤本身会根据需要将转义序列删除,除了解析步骤按照上述说明进行操作的字符串文字之外。

© www.soinside.com 2019 - 2024. All rights reserved.