The Python Language Reference / Справочник по языку Python: 2. Lexical analysis

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

2. Лексический анализ
Парсер (синтаксический анализатор) выполняет синтаксический анализ программы, написанной на языке программирования Python. В качестве исходных данных парсер получает последовательность лексем (токенов), полученную в результате лексического анализа программы. В этой главе описывается как в процессе лексического анализа происходит распознавание и выделение лексем из исходного текста программы.

simba87 01.04.10 в 10:59

0

Python воспринимает текст программы как набор символов Юникода. Кодировка по умолчанию - UTF-8 (см. PEP 3120), но также может быть выбрана и другая кодировка. Если исходный файл не может быть декодирован, то это приводит к возникновению синтаксической ошибки - SyntaxError.

simba87 01.04.10 в 11:08

0

2.1. Структура последовательностей
Программа разделяется на некоторое количество логических последовательностей.

simba87 01.04.10 в 11:11

0

2.1. Структура строк
Программа на Питоне состоит из условных (логических) строк.

Hittih 17.07.10 в 17:29

0

2.1.1. Логические последовательности
Концу логической последовательности соответствует лексема NEWLINE. Операторы не могут пересекать границу логической последовательности (содержать в себе NEWLINE), за исключением некоторых случаев, когда это разрешено синтаксисом (например, между отдельными операторами составного оператора). Логическая последовательность состоит из одной или более физических строк, объединяемых (явно или неявно) в соответствии с определёнными правилами.

simba87 01.04.10 в 11:27

0

2.1.1. Условные строки
Условные строки состоят из одной или нескольких физических строк, объединённых по правилам явного или неявного объединения (2.1.5. , 2.1.6.). Инструкции не могут пересекать границы условных строк, за исключением специальных случаев, предусмотренных синтаксисом (например, составные инструкции).

Hittih 18.07.10 в 01:44

0

2.1.2. Физические строки
Физическая строка - это последовательность символов, которая оканчивается специальными символами, обозначающими конец данной строки. Можно использовать любые стандартные символы конца строки: ASCII LF (Unix-вариант), ASCII CR LF (Windows-вариант), ASCII CR (старый Macintosh-вариант). Все приведённые варианты символов конца строки равноправны для использования независимо от используемой платформы.

simba87 01.04.10 в 11:32

0

При реализации Python строки исходного кода должны передаваться API Python'а с использованием стандартных соглашений C о символах новой строки (символ \n является ASCII LF - символом окончания строки).

vanderloos 01.07.10 в 09:18

0

При встраивании Питона в другое приложение, строки исходного кода на Питоне следует передавать из этого приложения в API Питона, следуя стандартным соглашениям языка "C" для символов новой строки (тоесть, символ "\n" , обозначающий ASCII LF ).

Hittih 04.07.10 в 13:17

0

2.1.3. Комментарии
Комментарий начинается с символа "решётки" (#), который не является строковым литералом, и продолжается до конца строки. Комментарий также обозначает конец логической последовательности, кроме тех случаев, когда происходит неявное объединение логических последовательностей. Комментарии игнорируются при анализе текста программы и не являются лексемами (токенами).

simba87 01.04.10 в 15:39

1

2.1.3. Комментарии
Комментарий начинается с символа "#" ("решётка"), если тот не является частью записи текстовых данных, и продолжается до конца физической строки. Комментарий также обозначает конец условной строки, кроме тех случаев, когда происходит неявное объединение условных строк. Комментарии игнорируются при анализе текста программы и не являются лексемами (токенами).

Hittih 20.07.10 в 07:14

0

2.1.4. Объявление кодировки
Если комментарий, расположенный в первой или второй строке скрипта, соответствует регулярному выражению coding[=:]\s*([-\w.]+), то при анализе он имеет значение объявления кодировки.

simba87 01.04.10 в 15:44

-1

2.1.4. Объявление кодировки
Если комментарий, расположенный в первой или второй строке скрипта, соответствует регулярному выражению coding[=:]\s*([-\w.]+), то при анализе он имеет значение объявления кодировки. Первая часть этого выражения называет кодировку исходного файла. Рекоммендуемыми формами выражения являются:

vanderloos 01.07.10 в 09:26

0

# -*- coding: -*-

vanderloos 01.07.10 в 09:27

0

понимаемое также GNU Emacs, и

vanderloos 01.07.10 в 09:28

0

понимаемое также GNU Emacs, и

vanderloos 01.07.10 в 09:29

0

# vim:fileencoding=

vanderloos 01.07.10 в 09:29

0

используемое в VIM Брэма Мооленаара (Bram Moolenaar)

vanderloos 01.07.10 в 09:31

0

Если объявление кодировки отсутствует, кодировкой по умолчанию считается UTF-8. К тому же, если первые байты файла соответствуют отметке байтового порядка UTF-8 (b'\xef\xbb\xbf'), объявленной кодировкой является UTF-8 (поддерживается, например, в Microsoft notepad (блокнот)).

vanderloos 01.07.10 в 09:36

0

Если кодировка объявлена, ее имя должно быть понято Python. Кодировка используется для лексического анализа, включая строковые литералы, комментрии и идентификаторы. Объявление кодировки должно быть в отдельной строке.

vanderloos 01.07.10 в 09:42

0

2.1.5. Явное объединение строк
Две или более физических строк могут быть объединены при помощи символа бэкслеш (\), как следствие, когда строка заканчивается бэкслешем, не являющимся частью строкового литерала или комментария, она объединяется со следующей, составляя единую логическую последовательность, не включающую бэкслеш и следующий за ним символ окончания строки. Например:

vanderloos 01.07.10 в 10:31

0

2.1.5. Явное объединение строк
Две или более физических строк могут быть объединены в одну условную строку при помощи символа бэкслэш (\) следующим образом: когда строка заканчивается бэкслэшем, не являющимся частью текстовых данных или комментария, она объединяется со следующей, составляя единую условную строку, не включающую бэкслэш и следующий за ним символ окончания строки. Например:

Hittih 22.08.10 в 11:58

0

if 1900 < year < 2100 and 1 <= month <= 12 \
and 1 <= day <= 31 and 0 <= hour < 24 \
and 0 <= minute < 60 and 0 <= second < 60: # Верная проверка даты
return 1

vanderloos 01.07.10 в 10:33

0

if 1900 < year < 2100 and 1 <= month <= 12 \
and 1 <= day <= 31 and 0 <= hour < 24 \
and 0 <= minute < 60 and 0 <= second < 60: # похоже ли на дату
return 1

Hittih 22.08.10 в 12:02

0

Строка, которая заканчиваэтся бэкслешем, не может содержать комментарий. Бэкслеш не продолжает комментарий. Бэкслеш не продолжает лексемы (токены), кроме строковых литералов (т.е. токены, не являющиеся строковыми литералами, не могут быть разделены на строки с помощью бэкслеша). Бэкслеш недопустим в строке во всех других случаях вне строковых литералов.

vanderloos 01.07.10 в 10:43

0

Строка, оканчивающаяся бэкслэшем, не может содержать комментарий. Комментарий или другую лексему кроме текстовых данных, начатые на одной строке, нельзя продолжить с помощью бэкслэша на другой строке. Кроме конца физической строки бэкслэш допустим только внутри текстовых данных.

Hittih 07.07.10 в 08:17

0

2.1.6. Неявное объединение строк
Выражения в скобках, простых, квадратных либо фигурных, могут быть разделены на более одной физических строк без использования бэкслеша. Например:

vanderloos 01.07.10 в 10:48

0

2.1.6. Неявное объединение строк
Выражения в скобках - круглых, квадратных либо фигурных - могут быть разделены на несколько физических строк без использования бэкслэша. Например:

Hittih 07.07.10 в 08:21

0

month_names = ['Januari', 'Februari', 'Maart', # Это голландские
'April', 'Mei', 'Juni', # названия
'Juli', 'Augustus', 'September', # месяцев
'Oktober', 'November', 'December'] # года

vanderloos 01.07.10 в 10:49

0

Неявно продолженные строки могут содержать комментарии. Отступы не играют роли в продолженных строках. При продолжении разрешены пустые строки. Токена NEWLINE нет в неявно продолженных строках. Строки в тройных скобках (см. ниже) также могут быть неявно продолженными, в этом случае они не могут содержать комментарий.

vanderloos 01.07.10 в 10:57

0

2.1.7. Пустые последовательности
Логическая последовательность, содержащая только пробелы, знаки табуляции или перевода страницы и комментарии игнорируется (т.е. не создается токена NEWLINE). Во время интерактивного ввода операторов обработка пустой последовательности может отличаться в зависимости от реализации цикла чтение-вычисление-вывод. В стандартном интерактивном интерпретаторе полностью пустая логическая последовательность (т.е. не содержащая даже пробел или комментарий) завершает многострочный оператор.

vanderloos 01.07.10 в 11:11

0

2.1.7. Пустые строки
Условные строки, содержащие только пробелы, знаки табуляции или перевода страницы и комментарии игнорируется (т.е. не создается лексемы NEWLINE). Во время интерактивного ввода операторов обработка пустой последовательности может отличаться в зависимости от реализации цикла чтение-вычисление-вывод. В стандартном интерактивном интерпретаторе полностью пустая условная строка (т.е. не содержащая даже пробел или комментарий) завершает многострочный оператор.

Hittih 22.08.10 в 12:32

0

2.1.8. Отступы
Знаки пробела и табуляции начинающие логическую строку используются для вычисления уровня отступа строки, который, в свою очередь, определяет группировку операторов.

vanderloos 01.07.10 в 11:21

0

Знаки табуляции заменяются (слева напрво) по одному на восемь пробелов так, что общее число символов после замены кратно восьми (здесь использовано то же правило, что и в Unix). Общее число знаков перед первым непустым символом определяет отступ строки. Отступ не может быть разделен между многими физическими строками с помощью бэкслеша; знаки пробела и табуляции до первого бэкслеша определяют отступ.

vanderloos 02.07.10 в 09:05

0

Отступы отклоняются как противоречивые, если исходный файл смешивает табуляции и пробелы таким образом, что делает смысл зависящим от размера табуляции в пробелах; в таком случае генерируется "TabError" .

Hittih 04.07.10 в 12:08

0

Отступы не принимаются из-за противоречивости, если исходный файл смешивает табуляции и пробелы таким образом, что делает смысл зависящим от размера табуляции в пробелах; в таком случае генерируется «TabError» .

Hittih 22.08.10 в 12:45

0

Замечание о кроссплатформенной совместимости: из-за особенностей текстовых редакторов на не-UNIX платформах - не следует использовать смесь пробелов и табуляций для отступов в одном исодном файле. Также следует отметить, что различные платформы могут явно ограничивать максимальный уровень отступов.

Hittih 04.07.10 в 12:45

0

Символ перевода страницы может находится в начале строки, тогда он игнорируется при расчете отступов. В любом другом месте символ перевода страницы между пробелами в начале строки может обрабатываться неопределенным образом (например, может сбрасывать счетчик предыдущих пробелов до нуля).

vanderloos 05.07.10 в 13:05

0

Уровни отступа строк используются для создания токенов INDENT (отступ) и DEDENT (конец отступа) при помощи стека, как описано ниже.

vanderloos 05.07.10 в 13:13

0

Перед чтением первой строки файла в стек записывется значение 0, это значение никогда не удалится. Числа, заносимые в стек, будут сторого возрастать. В начале каждой логической строки уровень отступа сравнивается с максимальным значением стека; если они равны, то ничего не происходит. Если уровень отступа больше, то он заносится в стек, и создается один токен INDENT. Если уровень меньше, то это число уже должно быть в стеке; все числа, которые больше, удаляются, и для каждого удаленного числа создается токен DEDENT. В конце файла токены DEDENT создаются для всех оставшихся в стеке чисел больше нуля.

vanderloos 05.07.10 в 14:35

0

Перед чтением первой строки файла в стек записывается значение «0», это значение никогда не будет извлечено. Числа, заносимые в стек, будут строго возрастать. В начале каждой условной строки уровень отступа сравнивается с максимальным значением на верху стека; если они равны, то ничего не происходит. Если уровень отступа больше, то он заносится в стек, и создается одна лексема «INDENT». Если уровень меньше, то это число уже должно быть в стеке; все числа, которые больше, удаляются, и для каждого удаленного числа создается лексема «DEDENT» . В конце файла лексемы «DEDENT» создаются для всех оставшихся в стеке чисел больше нуля.

Hittih 22.08.10 в 13:01

0

Здесь приведен пример Python кода с правильно (но странновато) расставленными отступами:

vanderloos 05.07.10 в 14:44

0

def perm(l):
# Расчет списка всех перестановок l
if len(l) <= 1:
return [l]
r = []
for i in range(len(l)):
s = l[:i] + l[i+1:]
p = perm(s)
for x in p:
r.append(l[i:i+1] + x)
return r

vanderloos 05.07.10 в 14:45

0

Следующий пример показывает различные ошибки в отступах:

vanderloos 05.07.10 в 14:46

0

def perm(l): # Ошибка: отступ первой строки
for i in range(len(l)): # Ошибка: без отступа
s = l[:i] + l[i+1:]
p = perm(l[:i] + l[i+1:]) # Ошибка: неожиданный отступ
for x in p:
r.append(l[i:i+1] + x)
return r # Ошибка: несогласованный отступ

vanderloos 05.07.10 в 14:56

0

(Вообще-то, первые три ошибки найдены парсером, и только последняя - лексическим анализатором: уровень отступа return r не совпадает с уровнем в стеке.)

vanderloos 05.07.10 в 15:07

0

2.1.9. Пробелы между токенами
Кроме начала логической строки или в строковом литерале символы пробела, табуляции и перевода страницы могут быть взаимозаменяемы при разделении токенов. Эти символы необходимы между двумя токенами только, если результат их объединения может быть интерпретирован как другой токен (напр.: ab - это один токен, но a и b - два других токена).

vanderloos 05.07.10 в 15:17

0

2.1.9. Пробелы между лексемами
Кроме начала логической строки или в записи текстовых данных символы пробела, табуляции и перевода страницы могут быть взаимозаменяемы при разделении лексем. Эти символы необходимы между двумя лексемами только, если результат их объединения может быть интерпретирован как другая лексема (например : «ab» - это одна лексема, но «a b» - две лексемы) .

Hittih 22.08.10 в 13:16

0

2.2. Другие токены (лексемы)
Кроме NEWLINE, INDENT и DEDENT, существуют следующие категории токенов: идентификаторы, ключевые слова, литералы, операторы и разделители. Символы пробелов (кроме знаков конца строки, описанных ранее) не являются токенами, но служат для их разделения. Если появляется неопределенность, токен включает самую длинную возможную последовательность, представляющую собой действительный токен (чтение происходит слева направо).

vanderloos 07.07.10 в 07:42

0

2.2. Другие лексемы
Кроме «NEWLINE» , «INDENT» и «DEDENT» , существуют следующие категории лексем: идентификаторы, ключевые слова, литералы (непосредственная запись данных) , операторы и разделители. Символы пробелов (кроме знаков конца строки, описанных ранее) не являются лексемами, а служат для их разделения. Если появляется неопределенность, лексема включает самую длинную возможную последовательность, представляющую собой действительную лексему (чтение происходит слева направо) .

Hittih 22.08.10 в 13:23

0

2.3. Идентификаторы и ключевые слова
Идентификаторы (также называемые "имена") описаны следующим лексическим определением.

vanderloos 07.07.10 в 07:45

0

2.3. Идентификаторы и ключевые слова
Идентификаторы (имена) имеют следующее лексическое определение.

Hittih 22.08.10 в 13:35

0

Синтаксис идентификаторов в Python основывается на стандартном приложении к Unicode: UAX-31, с переработкой и изменениями описанными ниже, см. также PEP 3131 для более подробной информации.

vanderloos 07.07.10 в 07:49

0

Синтаксис идентификаторов в Питоне основывается на приложении «UAX-31» к стандарту «Unicode» , с переработкой и изменениями описанными ниже. Также смотрите дополнительные детали в «PEP 3131» .

Hittih 23.08.10 в 09:48

0

В ASCII диапазоне (U+0001..U+007F) для идентификаторов можно использовать те же символы, что и в Python 2.x: буквы от A до Z в вержнем и нижнем регистре, подчеркивание _ и цифры от 0 до 9, кроме первого символа идентификатора.

vanderloos 07.07.10 в 07:55

0

В ASCII диапазоне (U+0001..U+007F) в идентификаторах допустимы только те же символы, что и в Питоне 2.x : буквы от «A» до «Z» в верхнем и нижнем регистре, подчеркивание «_» и, кроме первого символа идентификатора, – цифры от «0» до «9» .

Hittih 23.08.10 в 10:01

0

В Python 3.0 представлены дополнительные символы, не входящие в ASCII диапазон (см. PEP 3131). Для этих символов использована классификация из версии базы символов Unicode (Unicode Character Database), включенная в модуль unicodedata.

vanderloos 07.07.10 в 07:59

0

Идентификаторы не ограничены по длине и чувствительны к регистру.

vanderloos 07.07.10 в 08:00

0

identifier ::= id_start id_continue*
id_start ::=
id_continue ::= <all characters="characters" in="in" plus="plus" the="the" categories="categories" pc="pc" and="and" others="others" with="with" property="property"></all>

vanderloos 07.07.10 в 08:02

0

identifier ::= id_start id_continue*
id_start ::= &lt все символы в общих категориях Lu, Ll, Lt, Lm, Lo, Nl, подчёркивание, и символы со свойством Other_ID_Start &gt
id_continue ::= &lt все символы в id_start, плюс символы в категориях Mn, Mc, Nd, Pc и другие символы со свойством Other_ID_Continue &gt

Hittih 23.08.10 в 10:22

0

Использованные выше категории Unicode:

vanderloos 07.07.10 в 08:38

0

Использованные выше обозначения категорий Юникода :

Hittih 23.08.10 в 10:43

0

* Lu - буквы в верхнем регистре
* Ll - буквы в нижнем регистре
* Lt - Заглавные буквы
* Lm - модифицирующие символы
* Lo - другие буквы
* Nl - буквенные числа
* Mn - непробельные знаки
* Mc - пробельные составные знаки
* Nd - десятичные цифры
* Pc - пунктуационные знаки

vanderloos 07.07.10 в 09:02

0

Все идентификаторы конвертируются в форму нормализации NFC при лексическом разборе; сравнение идентификаторов основано на NFC.

vanderloos 07.07.10 в 09:05

0

Все идентификаторы при лексическом разборе конвертируются в нормализованную форму NFC; и сравнение идентификаторов производится уже в форме NFC.

Hittih 23.08.10 в 10:52

0

Ненормативный HTML файл со списком всех доступных символов для использования в идентификаторах для Unicode 4.1 представлен здесь: http://www.dcl.hpi.uni-potsdam.de/home/loewis/table-3131.html.

vanderloos 07.07.10 в 09:07

0

Ненормативный HTML файл со списком всех символов Юникода 4.1 , доступных для использования в идентификаторах, представлен здесь: http://www.dcl.hpi.uni-potsdam.de/home/loewis/table-3131.html.

Hittih 23.08.10 в 10:56

0

2.3.1. Ключевые слова
Следующие идентификаторы являются зарезервированными или ключевыми словами языка и не могут быть использованы как обычные идентификаторы. Они должны быть написаны именно так, как здесь:

vanderloos 07.07.10 в 09:10

0

False class finally is return
None continue for lambda try
True def from nonlocal while
and del global not with
as elif if or yield
assert else import pass
break except in raise

vanderloos 07.07.10 в 09:10

0

2.3.2. Зарезервированные классы идентификаторов
Определенные классы идентификаторов (помимо ключевых слов) имеют определенное значение. Эти классы отмечаются по шаблону: символ подчеркивания в начале и в конце.

vanderloos 07.07.10 в 09:15

0

2.3.2. Зарезервированные классы идентификаторов
Определенные классы идентификаторов (помимо ключевых слов) имеют особое значение. Эти классы определяются соответствующей комбинацией символов подчеркивания в начале и в конце.

Hittih 23.08.10 в 12:58

0

_*

vanderloos 07.07.10 в 09:18

0

Не импортировать с помощью from module import *. Специальный идентификатор _ используется интерактивным интерпретатором для хранения результата последнего вычисления, хранится он в модуле builtins. Не в интерактивном режиме _ не имеет специального значения, неопределен. См. раздел "Объявление импорта".

vanderloos 07.07.10 в 09:19

0

Не импортируются инструкцией «from module import *» . Специальный идентификатор «_» используется интерактивным интерпретатором для хранения результата последнего вычисления, хранится он в модуле «builtins» . Не в интерактивном режиме «_» не имеет специального значения, не определен. (Смотрите раздел «Объявление импорта» ) .

Hittih 23.08.10 в 13:05

0
Минутку...

Следующая страница →