Лексический анализ
Первый шаг интерпретации программы на языке Python – лексический анализ кода. Символы алфавита любого языка программирования образуют лексемы. Если декларация кодировки отсутствует, то, по умолчанию, для построения лексем используются символы кодировки UTF-8. Лексический анализатор получает поток лексем. Лексема (token) – это минимальная единица языка, имеющая самостоятельный смысл. Лексемы – формируют базовый словарь языка, понятный компилятору. Если исходный файл не может быть расшифрован, то будет выдано сообщение об ошибке.
Всего существует пять видов лексем:
- Ключевые слова (keywords)
- Идентификаторы (identifiers)
- Литералы (literals)
- Операции (operators)
- Знаки пунктуации (разделители, punctuators)

Строки исходного файла
- Физические строки
- Логические строки
- Отступы в начале строки
Физическая строка исходного файла – это строка заканчивающаяся символом признака конца строки. Этот признак – специальный символ, зависящий от платформы. В Unix, использует ASCII LF (перевод строки), в Windows – последовательность ASCII CR LF (возврат каретки с последующим переводом строки) и Macintosh – ASCII CR (возврат каретки). Все эти формы можно использовать в равной степени, независимо от платформы.
Программа Python разделена на несколько логических строк. Логическая строка содержит одну или более физических строк, соединяющихся правилами языка. (В интерактивном режиме продолжение логической строки на новой физической строке будет начинаться с символов ...
).
Ведущие пробельные символы (пробелы и табуляции) в начале строки используются в Python для определения группы инструкций, как единого целого – составной инструкции или блока. Отступы в пределах блока должны быть равной символьной длины, иначе это приведет к ошибке. Для совместимости на разных платформах не следует применять смесь из пробелов и табуляций.
Например:
begin_fill() for i in range(5): fd(150) for j in range(5): fd(50) left(144) left(144) end_fill()
Комментарии в Python начинаются с символа "#"
. Комментарий заканчивается в конце физической строки и означают конец логической строки, если не используется неявное соединение строки (см. ниже). Комментарии игнорируются компилятором. “Текст программы говорит о том, как, а комментарии должны объяснять, почему” («A Byte of Python» Swaroop Chitlur).
Две (или более) физические строки могут быть объединены в одну логическую строку с использованием обратного слэша ("\"
), а именно: когда физическая строка заканчивается символом "\"
и он не является частью строки (т. е. не находится в пределах " "
) или комментария, он присоединяет следующую физическую строку, образуя одну логическую строку. После символа "\"
должен следовать символ признака конца строки (т. е. физическая строка должна заканчиваться). Например:
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
Выражения в скобках, в квадратных скобках, либо в фигурных скобках можно разделить на несколько физических строк без использования обратной косой черты. Например:
month_names = ['Januari', 'Februari', 'Maart', # Здесь перечислены 'April', 'Mei', 'Juni', # датские названия 'Juli', 'Augustus', 'September', # месяцев 'Oktober', 'November', 'December'] # года
Идентификаторы
Идентификатор – это имя программного объекта: переменной, константы, массива, функции, класса и т. п.
При выборе имени для объекта необходимо руководствоваться следующими правилами:
- первый символ не должен быть числовым символом;
- первый символ может быть любой алфавитный символ ASCII, символ нижнего подчеркивания, а также любой символ национальных алфавитов (в кодировке UTF-8);
- далее в имени можно использовать как алфавитные, так и числовые символы, за исключением пробельных символов;
- в качестве имени нельзя использовать служебные (ключевые) слова; список этих слов можно получить в интерактивном режиме с помощью импорта модуля
keyword
с вызовом контейнера ключевых словkeyword.kwlist
:>>> import keyword >>> keyword.kwlist ['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
Примечание: Python позволяет переопределять имена встроенных объектов, поэтому необходимо знать допустимость использования того или иного идентификатора. Для того, чтобы узнать весь список имен встроенных объектов python, можно использовать функцию
dir()
с параметром__builtins__
:>>> dir(__builtins__) ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '_', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
- нельзя использовать два подряд символа нижнего подчеркивания в начале и в конце идентификатора;
- в python регистро-зависимые имена, т. е.: BookId, bookID, Bookid, bookid, bookId и т. д., – разные имена.
Литералы
Литералы, иначе константы – это неизменяемые величины.
- Строковые литералы
Существуют строковые литералы двух типов:
1. String
-литералы и
2. Byte
-литералы
String
-литералы могут содержать любой символ UTF-8. Byte
-литералы только символы ASCII. Byte-литералам должен начинаться с префикса "B"
или "b"
. Литералы обоих типов должны заключаться в двойные (""
) или одинарные кавычки (''
).
Для длинных строковых литералов используются тройные кавычки """
или '''
. В пределах тройных кавычек можно использовать двойные или одинарные кавычки, использовать перевод на новую строку. Строка в Python не изменяемый объект.
"Это строка Юникода, в ней могут быть такие символы: ÄάξŞ" b"Это строка символов кодовой таблицы ASCII"
В python поддерживаются целочисленные литералы четырех типов:
1. decimalinteger
– десятичные числа. Префикс не используется.
2. octinteger
– восьмеричные числа. Префикс "0O"
или "0o"
.
3. hexinteger
– 16-ричные числа. Префикс "0x"
или "0X"
.
4. bininteger
– двоичные числа. Префикс "0b"
или "0B"
.
Примеры целочисленных литералов
7 2147483647 0o177 0b100110111 3 79228162514264337593543950336 0o377 0xdeadbeef
Действительные или вещественные числа представлены литералами двух типов:
1. с фиксированной точкой: 5.7
, .001
, 35.
, 0.0
2. с плавающей точкой (экспоненциальный): 0.2E6
, .11e-3
, 5E10
, 2.e-10
Примечание. Для представления порядка и мантиссы используются числа по основанию 10. Числовые литералы не включают в себя знак ("-"
или "+"
).
Примечание. К числовым литералам относятся также мнимые литералы.
Escape-последовательности
Escape-последовательности (или управляющие последовательности) используются для описания определённых специальных символов внутри строковых литералов, то есть внутри ограничителей ""
. Вот некоторые из них:
\'
– одинарная кавычка
\"
– двойная кавычка
\?
– вопросительный знак
\\
– обратный слеш
\n
– новая строка
\t
– горизонтальная табуляция
\v
– вертикальная табуляция
\0
– нулевой символ
Например: print("Ветер на море гуляет\nИ кораблик подгоняет;\nОн бежит себе в волнах\nНа раздутых парусах.")
Ветер на море гуляет И кораблик подгоняет; Он бежит себе в волнах На раздутых парусах.
Операции
Список литералов, используемых для операций в языке Python:
+ - * ** / // % @ << >> & | ^ ~ < > <= >= == !=
Разделители
Эти литералы используются в качестве разделителей:
( ) [ ] { } , : . ; @ = -> += -= *= /= //= %= @= &= |= ^= >>= <<= **=
Разделители сокращенного присваивания могут выступать и как разделители и как операции.
Неиспользуемые символы
Эти символы ASCII не используются в языке Python:
$ ? `
Их появление за пределами строковых литералов и комментариев является безусловной ошибкой.
Вопросы
- Перечислите правила использования идентификаторов
- Что произойдет, если вывести строковый литерал в котором встретился символ '\n'? '\t'?
- Для чего нужны комментарии?
- Какие из этих идентификаторов не содержат ошибок:
A, A1, a1, _1a, 1A, a_1, A1, A 1, _A1, aA, Aa, A_a, a_A, 10A, 10a, 10_A, a10_, 10 a, a__10, A10a, a10A, a_10A, A_10A
?
Темы сообщений
- Венгерская нотация
- Строковые литералы
- Cистемы генерации документации
- Системы контроля версий
- Unicode
- Кодировка utf-8
Презентация
Учебник
§55, вопр. 1, 2, 3.