Язык программирования Python.

Лексический анализ.

Лексический анализатор языка программирования разбивает исходный текст программы (состоящий из одиночных символов) на лексемы — неделимые «слова» языка.

Основные категории лексем Python: идентификаторы и ключевые слова (NAME), литералы (STRING, NUMBER и т.п.), операции (OP), разделители, специальные лексемы для обозначения (изменения) отступов (INDENT, DEDENT) и концов строк (NEWLINE), а также комментарии (COMMENT). Лексический анализатор доступен через модуль tokenize, а определения кодов лексем содержатся в модуле token стандартной библиотеки Python. Следующий пример показывает лексический анализатор в действии:

Import StringIO, token, tokenize.

Prog_example = """.

For i in range(100): # comment.

 if i % 1 == 0: \

 print ":", t**2.

""".strip().

Rl = StringIO.StringIO(prog_example).readline.

For t_type, t_str, (br,bc), (er,ec), logl in tokenize.generate_tokens(rl):

 print "%3i %10s : %20r" % (t_type, token.tok_name[t_type], t_str).

А вот что выведет эта программа, разбив на лексемы исходный код примера:

Prog_example:

 1      NAME :       'for'.

 1      NAME :         'i'.

 1      NAME :        'in'.

 1      NAME :     'range'.

50        OP :         '('.

 2    NUMBER :       '100'.

50        OP :         ')'.

50        OP :         ':'.

52   COMMENT : '# comment'.

 4   NEWLINE :        '\n'.

 5    INDENT :         ' '.

 1      NAME :        'if'.

 1      NAME :         'i'.

50        OP :         '%'.

 2    NUMBER :         '1'.

50        OP :        '=='.

 2    NUMBER :         '0'.

50        OP :         ':'.

 1      NAME :     'print'.

 3    STRING :       '":"'.

50        OP :         ','.

 1      NAME :         't'.

50        OP :        '**'.

 2    NUMBER :         '2'.

 6    DEDENT :          ''.

 0 ENDMARKER :          ''.

Фактически получен поток лексем, который может использоваться для различных целей. Например, для синтаксического «окрашивания» кода на языке Python. Словарь token.tok_name позволяет получить мнемонические имена для типа лексемы по номеру.